我的正则表达式匹配太多。我如何使其停止?

regex

34432 观看

5回复

97420 作者的声誉

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}的第一次出现时停止?

作者: Mark Biek 的来源 发布者: 2008 年 8 月 22 日

回应 5


104

6158 作者的声誉

决定

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

Project name:\s+(.*?)\s+J[0-9]{7}:
作者: jj33 发布者: 2008 年 8 月 22 日

12

417470 作者的声誉

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

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

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

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

作者: Konrad Rudolph 发布者: 2008 年 8 月 22 日

1

1700 作者的声誉

我还建议您使用“ Expresso”使用正则表达式进行试验-这是一个非常好的(免费的)正则表达式编辑和测试实用程序。

它的优点之一是,它的UI公开了许多正则表达式功能,而那些不熟悉正则表达式的人可能不熟悉它们,从而使他们很容易学习这些新概念。

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

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

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

作者: Hershi 发布者: 2008 年 8 月 22 日

4

6337 作者的声誉

好吧,".*"是一个贪婪的选择器。您可以使用使其不贪心。使用".*?"后一种构造时,正则表达式引擎将在每一步将文本匹配到"."尝试匹配".*?"。之后的任何make 。这意味着,例如如果后面没有任何内容".*?",则表示没有任何匹配。

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

string m = Regex.Match(s, @"Project name: (?<name>.*?) J\d+").Groups["name"].Value;
作者: Svend 发布者: 2008 年 8 月 22 日

0

211 作者的声誉

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

这将为您工作。

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

作者: Shailendra 发布者: 2018 年 7 月 16 日
32x32