我有这个巨大的丑陋的字符串:

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

我正在尝试使用正则表达式从中提取片段。 在这种情况下,我想抓住Project Name之后的所有内容,直到它说J0000011:的部分J0000011: (11 每次都是不同的数字)。

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

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

问题是它直到碰到J0000020:最后才停止。

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

===============>>#1 票数:151 已采纳

.*非贪婪加入' ? ' 在它之后:

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

===============>>#2 票数:15

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

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

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

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

===============>>#3 票数:5

嗯, ".*"是一个贪婪的选择器。 您可以通过使用".*?"使其变得非贪婪".*?" 使用后一种构造时,正则表达式引擎将在每一步将文本匹配到"." 尝试匹配".*?"之后的任何 make . 这意味着,例如,如果在".*?"之后没有任何内容".*?" ,那么它什么都不匹配。

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

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

===============>>#4 票数:1

我还建议您使用“Expresso”尝试使用正则表达式 - 这是一个用于正则表达式编辑和测试的出色(且免费)实用程序。

它的一个优点是它的 UI 公开了许多不熟悉正则表达式的人可能不熟悉的正则表达式功能,这样他们就可以轻松学习这些新概念。

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

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

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

===============>>#5 票数:-1

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

这对你有用。

添加 (?:\\\\w+)+.[a-zA-Z]+ 而不是 .*

  ask by Mark Biek translate from so

未解决问题?本站智能推荐: