109

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

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:(11 每次都会是不同的数字)。

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

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

问题是它直到到达J0000020:才停止。

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

4

5 回答 5

162

通过在其后添加 ' '使.*非贪婪?

Project name:\s+(.*?)\s+J[0-9]{7}:
于 2008-08-22T14:12:01.243 回答
15

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

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

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

\S意思是“除了空格之外的所有东西,这正是你想要的。

于 2008-08-22T14:15:57.287 回答
5

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

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

string m = Regex.Match(s, @"Project name: (?<name>.*?) J\d+").Groups["name"].Value;
于 2008-08-22T14:24:12.243 回答
1

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

它的一个优点是它的 UI 暴露了许多不熟悉 regex 的人可能不熟悉的 regex 功能,以一种让他们很容易学习这些新概念的方式。

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

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

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

于 2008-08-22T14:17:21.603 回答
0

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

这对你有用。

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

于 2018-07-16T08:05:39.603 回答