如果我有一个未知的结构字符串:
"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"
我想捕捉"我关心的东西",它将永远在最后一次发生THING之后。THING有可能出现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"
Regex返回最长的最左边匹配。第一个通配符最初将匹配到行尾,然后一次连续回溯一个字符,直到正则表达式的其余部分产生匹配,即匹配字符串中的最后一个THING
。
在匹配过程中,.*THING
将首先匹配所有内容,直到并包括THING
的最后出现
如果模式的其余部分无法匹配,它将通过变短来回溯并匹配所有内容,直到并包括THING
的最后一次出现,然后再次尝试模式的其余部分
然而,模式的其余部分是.*
,它将始终匹配,因为它将匹配空字符串
因此,.*THING(.*)
将匹配到并包括THING
的最后一次出现,并且将匹配并捕获字符串的其余部分
注意
.
将匹配除换行符之外的任何内容。如果文本中可能有换行符,那么您将希望使用/s
修饰符使其与中的任何内容相匹配
还要注意
如果模式不匹配(例如,因为字符串中没有THING
(,则$1
将保持不变。它仍然包含最近成功的模式匹配所设置的内容。这意味着在使用$1
的值之前,必须检查模式匹配的状态
这是我的看法。
/^(?!THING).+THING((?:(?!THING).)+)$/
接受一个字符串,该字符串包含一个或多个THING。THING不能在字符串的开头或末尾。它在最后一次THING出现后获取文本。
编辑:在字符串开头添加了对"THING"的检查。
编辑:哇,重读你的眼镜(我真的看错了(。你说如果出现0次,那么就没有我关心的东西了。字符串不能以THING开头或结尾
那么您的正则表达式就可以了。tripleee
很好地解释了这种情况。