J0000000: Transaction A0001401 started on 8/22/2008 9:49:29 AM
J0000010: Project name: E:\foo.pf
J0000011: Job name: MBiek Direct Mail Test
J0000020: Document 1 - Completed successfully
Run Code Online (Sandbox Code Playgroud)
我有这个巨大的丑陋的字符串,我正在尝试使用正则表达式从中提取片段.
在这种情况下,我想抓住"项目名称"之后的所有内容,直到它说"J0000011:"的部分(每次11将是一个不同的数字).
这是我一直在玩的正则表达式
Project name:\s+(.*)\s+J[0-9]{7}:
Run Code Online (Sandbox Code Playgroud)
问题是它不会停止,直到它碰到J0000020:最后.
如何在第一次出现J [0-9] {7}时使正则表达式停止?
jj3*_*j33 111
.*通过?在其后添加' ' 使非贪婪:
Project name:\s+(.*?)\s+J[0-9]{7}:
Run Code Online (Sandbox Code Playgroud)
Kon*_*lph 14
在这里使用非贪婪量词可能是最好的解决方案,也因为它比贪婪的替代方案更有效:贪婪的匹配通常尽可能地(在这里,直到文本的结尾!)然后追溯字符后面的字符尝试匹配之后的部分.
但是,请考虑使用否定字符类:
Project name:\s+(\S*)\s+J[0-9]{7}:
Run Code Online (Sandbox Code Playgroud)
\S 意思是"除了空白之外的所有东西,这正是你想要的.
嗯,".*"是一个贪婪的选择器。您可以通过 using 使其变得非贪婪".*?"当使用后一种构造时,正则表达式引擎将在每一步将文本匹配到"."尝试匹配".*?". 这意味着,例如,如果 之后没有任何内容".*?",则它不匹配任何内容。
这是我使用的。s包含您的原始字符串。这段代码是特定于 .NET 的,但大多数正则表达式都有类似的东西。
string m = Regex.Match(s, @"Project name: (?<name>.*?) J\d+").Groups["name"].Value;
Run Code Online (Sandbox Code Playgroud)