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

时间:2018-07-24 21:18:52

标签: regex perl greedy regex-greedy quantifiers

如果我的结构字符串未知:

"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次或多次THING。如果出现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"

3 个答案:

答案 0 :(得分:10)

正则表达式返回最长的最左匹配项。第一个通配符将首先匹配到行尾,然后一次一次回溯一个字符,直到正则表达式的其余部分产生匹配为止,即,匹配字符串中的最后一个THING

答案 1 :(得分:3)

在匹配过程中,.*THING最初将匹配直到{em>最后出现THING

的所有内容

如果没有其他模式可以匹配的,它将通过变短而回溯,并匹配直到最后但包括发生THING,然后再次尝试其余模式

但是模式的其余部分是.*,它会始终匹配,因为它将匹配一个空字符串

因此,.*THING(.*)将匹配并包括THING last 最后出现的情况,并将匹配并捕获其余的字符串

注意 .将匹配除换行符以外的所有内容。如果您的文本中可能包含换行符,那么您将需要使用/s修饰符使其完全匹配任何内容

请注意 ,如果模式不匹配(例如,字符串中没有THING),则$1将维持不变。它仍将包含最近成功的模式匹配所设置的内容。这意味着您必须在使用$1

的值之前检查模式匹配的状态

答案 2 :(得分:0)

这是我的主意。

/^(?!THING).+THING((?:(?!THING).)+)$/

接受一个或多个THING出现的字符串。不能在字符串的开头或结尾。它会在最后一次出现THING之后获得文本。

编辑:在字符串开头添加了对“ THING”的检查。

编辑:哇,请重新阅读您的规格(我确实误读了)。您说如果出现0次,那么我不在乎。字符串不能以THING开头或结尾。

然后您的正则表达式就可以了。 tripleee很好地说明了这种情况。