我的正则表达式模式是这样的

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

我只对分配给位置的引号中的部分感兴趣。如果没有贪婪开关,它不应该像下面这样简单吗?

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

似乎并不奏效。


当前回答

因为您使用的是量化子模式,正如Perl Doc中描述的那样,

默认情况下,量化的子模式是“贪婪的”,也就是说,它会 尽可能多地匹配(给定一个特定的起始位置) 同时仍然允许模式的其余部分匹配。如果你想要的话 要匹配尽可能少的次数,请跟随量词 用"?". 注意,意思没有改变,只是the “贪吃”:

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

因此,为了让您的量化模式进行最小匹配,请遵循?:

/location="(.*?)"/

其他回答

这里的其他答案未能为不支持非贪婪匹配的正则表达式版本提供完整的解决方案。贪心量词(.*?, + ?etc)是一个Perl 5扩展,在传统正则表达式中不受支持。

如果你的停止条件是单个字符,解决方法很简单;而不是

a(.*?)b

你可以匹配

a[^ab]*b

即指定一个字符类,其中不包括开始和结束分隔符。

在更一般的情况下,您可以费力地构造一个表达式

start(|[^e]|e(|[^n]|n(|[^d])))end

捕获start和end的第一次出现之间的匹配。请注意带有嵌套括号的子表达式是如何拼写出许多替代选项的,它们之间只有在后面没有nd等情况下才允许e,并且还要注意将空字符串覆盖为一个不匹配在特定位置上不允许的选项的替代选项。

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

如何

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

这避免了使用.*进行无限搜索,并将精确匹配第一个引号。

因为您使用的是量化子模式,正如Perl Doc中描述的那样,

默认情况下,量化的子模式是“贪婪的”,也就是说,它会 尽可能多地匹配(给定一个特定的起始位置) 同时仍然允许模式的其余部分匹配。如果你想要的话 要匹配尽可能少的次数,请跟随量词 用"?". 注意,意思没有改变,只是the “贪吃”:

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

因此,为了让您的量化模式进行最小匹配,请遵循?:

/location="(.*?)"/

还有另一种方法。

这是你要的。这是懒惰[\s\ s]*?

第一项: [\ s \ s] *(?:位置 ="[^"]*")[\ s \] *替换为:1美元

解释:https://regex101.com/r/ZcqcUm/2


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

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

解释:https://regex101.com/r/LXSPDp/3


这两个正则表达式之间只有一个区别,那就是?

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

Eg,

如果你有全局flag /g,它会匹配所有最小长度的匹配,如下所示。