我的正则表达式匹配太多了。我怎么让它停下来?

时间:2008-08-22 14:10:40

标签: regex

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

我有这个巨大的丑陋字符串,我正在尝试使用正则表达式从中提取片段。

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

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

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

问题是它不会停止,直到它最后到达 J0000020:

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

5 个答案:

答案 0 :(得分:98)

通过在其后添加“.*”来使?非贪婪:

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

答案 1 :(得分:11)

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

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

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

\S表示“除了空白之外的所有内容,这正是您想要的。

答案 2 :(得分:4)

嗯,".*"是一个贪婪的选择器。你使用".*?"使它非贪婪当使用后一种结构时,正则表达式引擎会在每一步都将文本与"."尝试匹配,以匹配".*?"之后的任何内容。 。这意味着如果例如".*?"之后没有任何内容,那么它就不匹配。

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

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

答案 3 :(得分:1)

我还建议你使用“Expresso”试验正则表达式 - 它是一个实用程序,是一个很好的(和免费的)实用程序,用于正则表达式编辑和测试。

它的一个优点是它的UI暴露了很多正则表达式功能,人们不熟悉正则表达式可能不熟悉,以便他们很容易学习这些新概念。

例如,在使用UI构建正则表达式并选择“*”时,您可以选中“尽可能少”复选框并查看生成的正则表达式,并测试其行为,即使您以前不熟悉非贪婪的表达方式。

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

快递下载: http://www.ultrapico.com/ExpressoDownload.htm

答案 4 :(得分:0)

(项目名称:\ s + [AZ]:(?:\\ w +)+。[a-zA-Z] + \ s + J [0-9] {7})(?=:)

这将为您工作。

添加(?:\\ w +)+。[a-zA-Z] +比。*更具限制性。