我的正则表达式模式是这样的
<xxxx location="file path/level1/level2" xxxx some="xxx">
我只对分配给位置的引号中的部分感兴趣。如果没有贪婪开关,它不应该像下面这样简单吗?
/.*location="(.*)".*/
似乎并不奏效。
我的正则表达式模式是这样的
<xxxx location="file path/level1/level2" xxxx some="xxx">
我只对分配给位置的引号中的部分感兴趣。如果没有贪婪开关,它不应该像下面这样简单吗?
/.*location="(.*)".*/
似乎并不奏效。
当前回答
使用惰性量词?没有全局标志就是答案。
Eg,
如果你有全局flag /g,它会匹配所有最小长度的匹配,如下所示。
其他回答
你需要让你的正则表达式变得懒惰/非贪婪,因为默认情况下,“(.*)”将匹配所有“file path/level1/level2”xxx some=“xxx”。
相反,你可以让你的点星号是非贪婪的,这将使它匹配尽可能少的字符:
/location="(.*?)"/
增加一个?在量词(?, *或+)使其非贪婪。
注意:这只适用于实现Perl 5扩展的正则表达式引擎(Java, Ruby, Python等),而不适用于“传统”正则表达式引擎(包括Awk, sed,不带-P的grep等)。
使用非贪婪匹配,如果你的引擎支持的话。加上?捕获内部。
/location="(.*?)"/
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))
输出: 玛丽
Location ="(.*)"将从" after Location ="直到" after some="xxx匹配,除非你让它是非贪婪的。
所以你需要。*?(即通过添加?使其非贪婪),或者更好地将.*替换为[^"]*。
[^"]匹配除" <引号>以外的任何字符 更通用:[^abc] -匹配除a, b或c之外的任何字符
还有另一种方法。
这是你要的。这是懒惰[\s\ s]*?
第一项: [\ s \ s] *(?:位置 ="[^"]*")[\ s \] *替换为:1美元
解释:https://regex101.com/r/ZcqcUm/2
为了完整起见,这里得到最后一个。这是贪婪的[\s\ s]*
最后一项:[\ s \ s] *(?:位置 ="([^"]*)")[\ s \] * 替换为:$1
解释:https://regex101.com/r/LXSPDp/3
这两个正则表达式之间只有一个区别,那就是?