regex 我的正则表达式匹配得太多了,怎么才能让它停下来?[副本]

bz4sfanl  于 2023-05-30  发布在  其他
关注(0)|答案(5)|浏览(88)

此问题已在此处有答案

Regular expression to stop at first match(9个回答)
3年前关闭。
我有一根巨大的丑陋的绳子:

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}时停止?

zpjtge22

zpjtge221#

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

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

sulc1iza2#

在这里使用非贪婪量词可能是最好的解决方案,也因为它比贪婪量词更有效:贪婪的比赛一般会尽可能地(在这里,直到文本的结尾!),然后一个字符接一个字符地追溯,以尝试匹配后面的部分。
但是,请考虑使用负数字符类:

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

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

70gysomp

70gysomp3#

".*"是一个贪婪选择器。使用".*?"使其非贪婪当使用后一种结构时,正则表达式引擎将在每一步将文本匹配到"."中,尝试匹配".*?"之后的任何make。这意味着,如果".*?"后面没有任何内容,那么它不匹配任何内容。
这是我用的。s包含原始字符串。这段代码是特定于.NET的,但大多数正则表达式都有类似的东西。

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

2skhul334#

我还建议您使用“Expresso”来尝试正则表达式--这是一个用于正则表达式编辑和测试的实用程序,一个很棒的(而且是免费的)实用程序。
它的一个优点是它的UI公开了很多没有经历过正则表达式的人可能不熟悉的正则表达式功能,在某种程度上,他们很容易学习这些新概念。
例如,当使用UI构建正则表达式并选择“*”时,您可以选中复选框“尽可能少”并查看结果正则表达式,以及测试其行为,即使您以前不熟悉非贪婪表达式。
可在他们的网站下载:http://www.ultrapico.com/Expresso.htm
快速下载:http://www.ultrapico.com/ExpressoDownload.htm

e4eetjau

e4eetjau5#

(Project name:\s+[A-Z]:(?:\w+)+.[a-zA-Z]+\s+J[0-9]{7})(?=:)

这个对你有用。
添加(?:\w+)+.[a-zA-Z]+将比添加.*更具限制性

相关问题