我的正则表达式匹配得太多了。 我如何让它停止?
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