繁体   English   中英

同一个正则表达式中的两个贪婪量词

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM