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