我的正则表达式看起来像
<xxxx location="file path/level1/level2" xxxx some="xxx">
我只对分配给位置的报价部分感兴趣 . 如果没有贪婪的开关,它不应该像下面那么容易吗?
/.*location="(.*)".*/
似乎没有用 .
使用没有全局标志的Lazy量词 ? 就是答案 .
?
例如,
如果你有全局标志 /g 那么它将匹配所有最低长度匹配,如下所示 .
/g
怎么样
.*location="([^"]*)".*
这样可以避免使用 . *进行无限制搜索,并且与第一个引号完全匹配 .
location="(.*)" 将在 some="xxx 之后的“ location= 之后”匹配,除非你让它变得非贪婪 . 因此,您需要 .*? (即使其非贪婪)或更好地用 [^"]* 替换 .* .
location="(.*)"
some="xxx
location=
.*?
[^"]*
.*
您需要使正则表达式非贪婪,因为默认情况下, "(.*)" 将匹配 "file path/level1/level2" xxx some="xxx" 的所有内容 .
"(.*)"
"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
因此,要允许您的量化模式进行最小匹配,请按 ? 进行操作:
6 回答
使用没有全局标志的Lazy量词
?
就是答案 .例如,
如果你有全局标志
/g
那么它将匹配所有最低长度匹配,如下所示 .怎么样
这样可以避免使用 . *进行无限制搜索,并且与第一个引号完全匹配 .
location="(.*)"
将在some="xxx
之后的“location=
之后”匹配,除非你让它变得非贪婪 . 因此,您需要.*?
(即使其非贪婪)或更好地用[^"]*
替换.*
.您需要使正则表达式非贪婪,因为默认情况下,
"(.*)"
将匹配"file path/level1/level2" xxx some="xxx"
的所有内容 .相反,你可以让你的点星非贪婪,这将使它尽可能少的字符匹配:
在量词(
?
,*
或+
)上添加?
使其非贪婪 .如果您的引擎支持,请使用非贪婪匹配 . 加?在捕获内部 .
因为您正在使用量化的子模式,并且如Perl Doc所述,
因此,要允许您的量化模式进行最小匹配,请按
?
进行操作: