我的正则表达式模式看起来像
<xxxx location="file path/level1/level2" xxxx some="xxx">
我只对分配给位置的引号感兴趣。如果没有贪婪的开关,这岂不是像下面一样容易吗?
/.*location="(.*)".*/
似乎不起作用。
我的正则表达式模式看起来像
<xxxx location="file path/level1/level2" xxxx some="xxx">
我只对分配给位置的引号感兴趣。如果没有贪婪的开关,这岂不是像下面一样容易吗?
/.*location="(.*)".*/
似乎不起作用。
Answers:
您需要将正则表达式设为非贪婪,因为默认情况下,"(.*)"
它将匹配所有"file path/level1/level2" xxx some="xxx"
。
相反,您可以使点星不贪心,从而使其与尽可能少的字符匹配:
/location="(.*?)"/
添加?
一个量词(?
,*
或+
)使它非贪婪。
.*?
它是.\{-}
一个非贪婪匹配。
由于您使用的是量化子模式,并且如Perl Doc中所述,
默认情况下,量化的子模式为“ 贪婪 ”,也就是说,它将尽可能多地匹配(给定特定的起始位置),同时仍允许其余模式匹配。如果希望它 与最小次数匹配,请在量词 后面加上 “?” 。请注意,含义不变,只是“贪婪”:
*? //Match 0 or more times, not greedily (minimum matches)
+? //Match 1 or more times, not greedily
因此,要使您的量化模式达到最小匹配,请遵循?
:
/location="(.*?)"/
这是另一种方式。
这是您想要的那个。这很懒[\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个区别,那就是 ?