我的正则表达式匹配太多了。

我的正则表达式匹配太多了。

My regex is matching too much. How do I make it stop?

1
2
3
4
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

我有一个巨大的丑陋的字符串,我正试图从它使用regex提取片段。

在这种情况下,我想抓住"项目名称"后面的所有内容,直到它显示"j0000011:"(11每次都是不同的数字)。

这是我玩过的雷吉士

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

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

如何使regex在第一次出现j[0-9]7时停止?


使.*不贪婪,在其后面加上'?

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

在这里使用非贪心量词可能是最好的解决方案,因为它比贪心量词更有效:贪心匹配通常尽可能地进行(在这里,直到文本结束!)然后跟踪字符后面的字符尝试和匹配的部分后来。

但是,请考虑使用否定字符类来代替:

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

EDCOX1"2"意味着"除了空白之外的所有东西,这正是你想要的。"


好吧,".*"是一个贪婪的选择者。通过使用".*?"使其不贪婪。当使用后一个构造时,regex引擎将在每一步将文本匹配到"."中,尝试匹配".*?"之后的任何生成。这意味着,例如,如果没有任何东西出现在".*?"之后,那么它与任何东西都不匹配。

这是我用过的。s包含原始字符串。此代码是特定于.NET的,但大多数regex的风格都类似。

1
string m = Regex.Match(s, @"Project name: (?<name>.*?) J\d+").Groups["name"].Value;

我还建议您尝试使用"expresso"来使用正则表达式——它是一个实用程序,是一个用于regex编辑和测试的伟大(免费)实用程序。

它的一个优点是,它的用户界面公开了很多对regex不熟悉的regex功能,这样他们就可以很容易地学习这些新概念。

例如,当使用UI构建regex并选择"*"时,您可以选中复选框"越少越好",查看结果regex,并测试它的行为,即使您以前不熟悉非贪婪表达式。

可在其网站下载:网址:http://www.ultrapico.com/expresso.htm

快速下载:http://www.ultrapico.com/expressodownload.htm


(项目名称:s+[a-z]:(?:\w+)+[a-za-z]+s+j[0-9]7)(?=)

这对你有用。

添加(?):\w+)+。[a-za-z]+将更严格,而不是。*


推荐阅读