Regex 我的正则表达式匹配得太多了。我怎样才能让它停止?
我有一根巨大丑陋的绳子:Regex 我的正则表达式匹配得太多了。我怎样才能让它停止?,regex,Regex,我有一根巨大丑陋的绳子: J0000000:事务A0001401于2008年8月22日上午9:49:29开始 J0000010:项目名称:E:\foo.pf J0000011:作业名称:MBiek直接邮件测试 J0000020:文件1-已成功完成 我试图用正则表达式从中提取片段。在这种情况下,我想抓住项目名称之后的所有内容,直到它显示J0000011:(11每次都是不同的数字) 这是我一直在玩的正则表达式: 项目名称:\s+(.*)\s+J[0-9]{7}: 问题是它直到最后到达j00002
J0000000:事务A0001401于2008年8月22日上午9:49:29开始
J0000010:项目名称:E:\foo.pf
J0000011:作业名称:MBiek直接邮件测试
J0000020:文件1-已成功完成
我试图用正则表达式从中提取片段。在这种情况下,我想抓住项目名称
之后的所有内容,直到它显示J0000011:
(11每次都是不同的数字)
这是我一直在玩的正则表达式:
项目名称:\s+(.*)\s+J[0-9]{7}:
问题是它直到最后到达j000020:时才会停止
如何使正则表达式在第一次出现
J[0-9]{7}
?时停止,在其后面添加“?
”,使*
非贪婪:
Project name:\s+(.*?)\s+J[0-9]{7}:
在这里使用非贪婪量词可能是最好的解决方案,也因为它比贪婪的方法更有效:贪婪匹配通常尽可能地(在这里,直到文本结尾!),然后一个字符接着一个字符地追溯,尝试匹配后面的部分
但是,考虑使用否定字符类代替:
Project name:\s+(\S*)\s+J[0-9]{7}:
\S
的意思是“除了空格之外的所有内容,这正是您想要的。我还建议您使用“Expresso”来尝试正则表达式-这是一个非常好的(免费)实用程序,用于正则表达式编辑和测试
它的一个好处是,它的UI公开了许多未使用正则表达式的人可能不熟悉的正则表达式功能,这样他们就可以很容易地了解这些新概念
例如,当使用UI构建正则表达式并选择“*”时,您可以选中复选框“尽可能少”,查看结果正则表达式,并测试其行为,即使您以前不熟悉非贪婪表达式
可从其网站下载:
快速下载:
好吧,“*”
是一个贪婪的选择器。您可以通过使用“*?”
使其非贪婪。当使用后一个构造时,正则表达式引擎将在每一步将文本匹配到“
中,尝试匹配”*?“
之后的任何make。这意味着,例如,如果之后没有任何make出现
,则不匹配任何内容
以下是我使用的。s
包含原始字符串。此代码特定于.NET,但大多数风格的正则表达式都有类似的内容
string m = Regex.Match(s, @"Project name: (?<name>.*?) J\d+").Groups["name"].Value;
string m=Regex.Match(s,@“项目名称:(?*)J\d+”)。组[“名称]。值;
(项目名称:\s+[A-Z]:(?:\\w+.[A-zA-Z]+\s+J[0-9]{7})(?=:)
这对你有用
添加(?:\\w++。[a-zA-Z]+将更具限制性,而不是。*在可能的情况下,添加贪婪的负数(或正数)字符类通常比懒惰的量词表现得更好。懒惰要求引擎按字符向前跟踪字符,检查每次跟随的模式直到匹配;贪婪的字符类可以无意识地重复所需的字符,这可能会快很多。因此,你可以考虑制作一个STRO。这是一个负字符类的例子,因为这是贪婪与懒惰的规范。已经有一些很棒的网站。我宁愿访问书签也不愿在我的计算机上有另一个程序。项目名称:[^\n]*\n(J[0-9]{7})