正则表达式在第一场比赛时停止

时间:2010-03-23 20:36:35

标签: regex

我的正则表达式看起来像

<xxxx location="file path/level1/level2" xxxx some="xxx">

我只对分配到位置的引号中的部分感兴趣。如果没有贪婪的开关,它不应该像下面那么容易吗?

/.*location="(.*)".*/

似乎不起作用。

9 个答案:

答案 0 :(得分:902)

您需要使正则表达式非贪婪,因为默认情况下,"(.*)"将匹配"file path/level1/level2" xxx some="xxx"的所有内容。

相反,你可以让你的点星非贪婪,这将使它尽可能少的字符匹配:

/location="(.*?)"/

在量词(??*)上添加+会使其变得非贪婪。

答案 1 :(得分:47)

location="(.*)"将匹配“location=之后”至“some="xxx之后”,除非您将其视为非贪婪。因此,您需要.*?(即使其不贪婪)或更好地将.*替换为[^"]*

答案 2 :(得分:29)

怎么样

.*location="([^"]*)".*

这可以避免使用。*进行无限制搜索,并且与第一个引号完全匹配。

答案 3 :(得分:17)

如果您的引擎支持,请使用非贪婪匹配。加?捕获内部。

/location="(.*?)"/

答案 4 :(得分:8)

使用没有全局标志的惰性量词?是答案。

例如

enter image description here

如果您具有全局标志/g,则它将与所有最低长度的匹配项匹配,如下所示。 enter image description here

答案 5 :(得分:1)

这是另一种方式。

这是您想要的那个。这很懒[\s\S]*?

第一项: [\s\S]*?(?:location="[^"]*")[\s\S]*替换为:$1

说明https://regex101.com/r/ZcqcUm/2


为完整起见,这是最后一个。这是贪婪的[\s\S]*

最后一项: [\s\S]*(?:location="([^"]*)")[\s\S]* 替换为:$1

说明https://regex101.com/r/LXSPDp/3


这两个正则表达式之间只有1个区别,即?

答案 6 :(得分:1)

此处的其他答案无法为不支持非贪婪匹配的正则表达式版本提供完整的解决方案。贪婪量词(.*?.+?等)是Perl 5扩展名,传统正则表达式不支持。

如果您的停止条件是单个字符,则解决方法很容易;代替

a(.*?)b

您可以匹配

a[^ab]*b

即指定一个字符类,该字符类不包括开始和结束的等号符。

在更一般的情况下,您可以费劲构造类似

的表达式
start(|[^e]|e(|[^n]|n(|[^d])))end

捕获startend首次出现之间的匹配。请注意,带有嵌套括号的子表达式是如何拼写出许多备选方案的,它们之间只有在e之后没有nd的情况下才允许--debug,并且还要注意将空字符串作为一个字符串覆盖与此特定时间点不允许的选项不匹配的替代方案。

当然,在大多数情况下,正确的方法是为要尝试解析的格式使用正确的解析器,但是有时,可能没有一个解析器,或者您使用的专用工具坚持使用常规解析器表达,别无其他。

答案 7 :(得分:0)

因为您使用的是量化子模式,并且按照Perl Doc的描述,

  

默认情况下,量化的子模式为“ 贪婪”,也就是说,   尽可能多次匹配(给定特定的起始位置)   同时仍允许其余样式匹配。如果你想要的话   要匹配最小次数,请遵循量词   带有一个“?” 。请注意,含义不会改变,只是   “贪婪”:

*?        //Match 0 or more times, not greedily (minimum matches)
+?        //Match 1 or more times, not greedily

因此,要使您的量化的模式进行最小匹配,请紧跟?

/location="(.*?)"/

答案 8 :(得分:0)

import regex
text = 'ask her to call Mary back when she comes back'                           
p = r'(?i)(?s)call(.*?)back'
for match in regex.finditer(p, str(text)):
    print (match.group(1))

输出: 玛丽