簡體   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