我的正则表达式匹配得太多了。 我如何让它停止?

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  J0000100: Machine name: DEV  J0000100: Project file: E:mbiekfoo.pf  J0000100: Template file: E:mbiekfoot.xdt  J0000100: Job name: MBiek  J0000100: Output folder: E:fooA0001401  J0000100: Temp folder: E:fooOutputA0001401  J0000100: Document 1 - Starting document  J0005000: Document 1 - Text overflowed on page 1 (warning)  J0000101: Document 1 - 1 page(s) composed  J0000102: Document 1 - 1 page(s) rendered at 500 x 647 pixels  J0000100: Document 1 - Completed successfully  J0000020:

我有这个巨大的丑陋的字符串,我试图从正则表达式中提取它。

在这种情况下,我想抓住“项目名称”之后的所有内容,直到它显示“J0000011:”的部分(每次11将会是不同的数字)。

这是我一直在玩的正则表达式

Project name:s+(.*)s+J[0-9]{7}:

问题是,它不会停止,直到它击中J0000020:最后。

如何在首次出现J [0-9] {7}时使正则表达式停止?


通过添加'非.*贪婪' ? '之后:

Project name:s+(.*?)s+J[0-9]{7}:

在这里使用非贪婪的量词可能是最好的解决方案,也因为它比贪婪的替代方法更有效率:贪婪的匹配通常会尽可能地(直到文本结尾!),然后在字符后追溯字符尝试匹配之后的部分。

Hower,请考虑使用否定字符类:

Project name:s+(S*)s+J[0-9]{7}:

S意思是“除了空格之外的所有东西,这正是你想要的。


那么, ".*"是一个贪婪的选择器。 你用".*?"使它变得非贪婪 当使用后一个构造时,正则表达式引擎将在每一步中将文本匹配到"." 试图匹配".*?"之后出现的任何内容 。 这意味着如果在".*?"之后没有任何内容出现 ,那么它什么都不匹配。

这是我用过的。 s包含你的原始字符串。 这段代码是.NET特有的,但大多数正则表达式都有类似的东西。

string m = Regex.Match(s, @"Project name: (?<name>.*?) Jd+").Groups["name"].Value;
链接地址: http://www.djcxy.com/p/76923.html

上一篇: My regex is matching too much. How do I make it stop?

下一篇: Is /g also greedy in perl?