我的正则表达式模式是这样的
<xxxx location="file path/level1/level2" xxxx some="xxx">
我只对分配给位置的引号中的部分感兴趣。如果没有贪婪开关,它不应该像下面这样简单吗?
/.*location="(.*)".*/
似乎并不奏效。
我的正则表达式模式是这样的
<xxxx location="file path/level1/level2" xxxx some="xxx">
我只对分配给位置的引号中的部分感兴趣。如果没有贪婪开关,它不应该像下面这样简单吗?
/.*location="(.*)".*/
似乎并不奏效。
当前回答
你需要让你的正则表达式变得懒惰/非贪婪,因为默认情况下,“(.*)”将匹配所有“file path/level1/level2”xxx some=“xxx”。
相反,你可以让你的点星号是非贪婪的,这将使它匹配尽可能少的字符:
/location="(.*?)"/
增加一个?在量词(?, *或+)使其非贪婪。
注意:这只适用于实现Perl 5扩展的正则表达式引擎(Java, Ruby, Python等),而不适用于“传统”正则表达式引擎(包括Awk, sed,不带-P的grep等)。
其他回答
如何
.*location="([^"]*)".*
这避免了使用.*进行无限搜索,并将精确匹配第一个引号。
你需要让你的正则表达式变得懒惰/非贪婪,因为默认情况下,“(.*)”将匹配所有“file path/level1/level2”xxx some=“xxx”。
相反,你可以让你的点星号是非贪婪的,这将使它匹配尽可能少的字符:
/location="(.*?)"/
增加一个?在量词(?, *或+)使其非贪婪。
注意:这只适用于实现Perl 5扩展的正则表达式引擎(Java, Ruby, Python等),而不适用于“传统”正则表达式引擎(包括Awk, sed,不带-P的grep等)。
使用惰性量词?没有全局标志就是答案。
Eg,
如果你有全局flag /g,它会匹配所有最小长度的匹配,如下所示。
使用非贪婪匹配,如果你的引擎支持的话。加上?捕获内部。
/location="(.*?)"/
因为您使用的是量化子模式,正如Perl Doc中描述的那样,
默认情况下,量化的子模式是“贪婪的”,也就是说,它会 尽可能多地匹配(给定一个特定的起始位置) 同时仍然允许模式的其余部分匹配。如果你想要的话 要匹配尽可能少的次数,请跟随量词 用"?". 注意,意思没有改变,只是the “贪吃”:
*? //Match 0 or more times, not greedily (minimum matches)
+? //Match 1 or more times, not greedily
因此,为了让您的量化模式进行最小匹配,请遵循?:
/location="(.*?)"/