我的正则表达式匹配太多。如何让它停止?[复制]

My regex is matching too much. How do I make it stop? [duplicate]

提问人:Mark Biek 提问时间:8/22/2008 最后编辑:Wiktor StribiżewMark Biek 更新时间:5/29/2023 访问量:79354

问:

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

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

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

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

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

问题在于,它不会停止,直到它到达J0000020:最后。

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

正则表达式

评论

0赞 Aphton 5/7/2019
项目名称:[^\n]*\n(J[0-9]{7})

答:

181赞 jj33 8/22/2008 #1

通过在它后面添加“”来使它变得不贪婪:.*?

Project name:\s+(.*?)\s+J[0-9]{7}:
15赞 Konrad Rudolph 8/22/2008 #2

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

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

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

\S意思是“除了空格之外的一切,这正是你想要的。

评论

0赞 CertainPerformance 10/30/2018
在可能实现的情况下,贪婪的否定(或肯定)字符类的性能通常明显优于惰性量词。Laziness 要求引擎逐个字符向前跟踪,每次检查遵循的模式,直到匹配为止;贪婪的角色类可以无意识地重复所需的角色,这可能会快得多。因此,您可以考虑为否定字符类提出更有力的理由,因为这是贪婪与懒惰的规范。
7赞 Svend 8/22/2008 #3

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

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

string m = Regex.Match(s, @"Project name: (?<name>.*?) J\d+").Groups["name"].Value;
0赞 Shailendra 7/16/2018 #4
(Project name:\s+[A-Z]:(?:\w+)+.[a-zA-Z]+\s+J[0-9]{7})(?=:)

这将为你工作。

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