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}?

有帮助吗?

解决方案

制作 .* 通过添加 ' 非贪婪?' 之后:

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

其他提示

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

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

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

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

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

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

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

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

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

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

可以在他们的网站下载: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]+ 将比 .* 更具限制性

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top