[英]Two greedy quantifiers in the same regex
如果我有一个未知的结构字符串:
"stuff I don't care about THING different stuff I don't care about THING ... THING even more stuff I don't care about THING stuff I care about"
我想捕捉“我关心的东西”,它总是在最后一次出现之后。 有可能出现0次或多次。 如果有0次出现则没有我关心的东西。 字符串不能以THING开头或结尾。
一些可能的字符串
"stuff I don't care about THING stuff I care about"
"stuff I don't care about"
一些不可能的字符串:
"THING stuff I care about"
"stuff I don't care about THING stuff I don't care about THING"
我目前解决这个问题的方法是使用带有两个贪心量词的正则表达式,如下所示:
if( /.*THING(.*)/ ) {
$myStuff = $1;
}
它似乎有效,但我的问题是两个贪婪量词如何相互作用。 第一个(最左边)贪婪量词总是“比第二个更贪婪”吗?
基本上我保证不会得到如下分割:
"stuff I don't care about THING"
$1 = "different stuff I don't care about THING even more stuff I don't care about THING stuff I care about"
与我想要的分裂相比:
"stuff I don't care about THING different stuff I don't care about THING even more stuff I don't care about THING"
"stuff I care about"
正则表达式返回最长的最左边的匹配。 第一个通配符最初将匹配到行尾,然后连续回溯一个字符,直到正则表达式的其余部分产生匹配,即使字符串中的最后一个THING
匹配。
在匹配过程中, .*THING
将首先匹配所有内容,包括最后一次出现的THING
如果模式的其余部分无法匹配 ,它将通过变短来回溯 ,并匹配所有内容,包括最后但只有一次出现的THING
,并再次尝试其余的模式
然而,模式的其余部分是.*
,它将始终匹配,因为它将匹配空字符串
因此, .*THING(.*)
将匹配并包括最后一次出现的THING
,并将匹配并捕获字符串的其余部分
请注意 .
将匹配除换行之外的任何内容。 如果您的文本中可能有换行符,那么您将需要使用/s
修饰符来使其匹配任何内容
另请注意 ,如果模式无法匹配(因为,例如,字符串中没有THING
),那么$1
将保持不变。 它仍将包含最近成功模式匹配所设置的内容。 这意味着在使用$1
的值之前必须检查模式匹配的状态
这是我的看法。
/^(?!THING).+THING((?:(?!THING).)+)$/
接受包含1次或多次THING的字符串。 THING不能在字符串的开头或结尾。 它会在最后一次出现后获取文本。
编辑:在字符串的开头添加了“THING”的检查。
编辑:哇,重读你的规格(我真的误读)。 你说如果有0次出现那就没有我关心的东西了。 字符串不能以THING开头或结尾。
然后你的正则表达式很好。 tripleee
解释了这个情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.