在一個源代碼,我發現這個正則表達式:匹配這個正則表達式:qr /(?!)/;
qr/(?!)/;
我根本想不通這是什麼比賽。
老實說,絕對不明白是什麼意思一個零寬度的負向預測斷言。 - 我在perlre中發現的。 :(
有人能解釋它在人類的語言嗎?:)
在一個源代碼,我發現這個正則表達式:匹配這個正則表達式:qr /(?!)/;
qr/(?!)/;
我根本想不通這是什麼比賽。
老實說,絕對不明白是什麼意思一個零寬度的負向預測斷言。 - 我在perlre中發現的。 :(
有人能解釋它在人類的語言嗎?:)
這是合法的,但完全沒有匹配。
(?!...)
構造是負向超前斷言。具體來說,它的意思是:「匹配後面的正則表達式(...
)應與而不是匹配輸入字符串的位置」。
但在這種情況下,「後面的正則表達式」是空的正則表達式,它匹配所有內容。
所以,這個正則表達式本質上是說「匹配後面的位置不能被空的正則表達式匹配」......並且不管輸入字符串如何,都不能有這樣的位置。這是一個總是失敗的正則表達式構造!
(?=)
,空積極前瞻,會始終保持一致。設置最後一次成功匹配的價值是一種駭人的方式。 (?!)
是它的倒數,並且永遠不會匹配。
空的正則表達式匹配一個零長度的字符串,也就是說它總是匹配。這是一個明顯的進步:
'bbbbb' =~ /^(?:aaa|bbb)/ # Matches (Matches 3 "b"s, from pos 0 to 3)
'bbbbb' =~ /^(?:aaa|bb)/ # Matches (Matches 2 "b"s, from pos 0 to 2)
'bbbbb' =~ /^(?:aaa|b)/ # Matches (Matches 1 "b", from pos 0 to 1)
'bbbbb' =~ /^(?:aaa|)/ # Matches (Matches 0 "b"s, from pos 0 to 0)
這意味着(?=)
(「難道這個位置後跟一個零長度字符串」)始終匹配和(?!)
(「是這個位置後面沒有零長度字符串?」 )從來沒有匹配。實際上,自從後者在5.10中引入後,(?!)
被優化爲(*FAIL)
。
(?!)
aka (*FAIL)
在模式有副作用時強制回溯是有用的。
'abcd' =~ /(.+?)(?{ print "$1\n" })(?!)/;
輸出:
a
ab
abc
abcd
b
bc
bcd
c
cd
d
例子說明:
(?!)
不匹配,因此正則表達式引擎不停地嘗試找到一個匹配具有.+?
比賽越來越多字符。如果失敗,則正則表達式引擎會嘗試在稍後的起始位置進行匹配。
這被稱爲「回溯」。正則表達式引擎可以匹配'aaaab' =~ /a*ab/
。第一次通過,a*
匹配所有4 a
s,所以ab
不匹配,所以引擎回溯。第二次通過,a*
只匹配a
s中的3個,允許ab
並因此整個模式匹配。
的步驟通過用於我原先給的例子步驟流程如下:
(.+?)
比賽a
在pos 0(?{ print "$1\n" })
打印a
和匹配零個字符(?!)
不符。 ⇒回溯!(.+?)
比賽ab
在pos 0(?{ print "$1\n" })
打印ab
和匹配零個字符(?!)
不匹配。 ⇒回溯!(.+?)
比賽abc
在pos 0(?{ print "$1\n" })
打印abc
和匹配零個字符(?!)
不匹配。 ⇒回溯!(.+?)
比賽abcd
在pos 0(?{ print "$1\n" })
打印abcd
和匹配零個字符(?!)
不匹配。 ⇒回溯!(.+?)
無法匹配其他任何東西。 ⇒回溯!(.+?)
比賽b
匹配在pos 1個(?{ print "$1\n" })
打印b
和匹配零個字符(?!)
不匹配。 ⇒回溯!(.+?)
比賽d
在pos 3(?{ print "$1\n" })
打印d
和匹配零個字符(?!)
不匹配。 ⇒回溯!(.+?)
無法匹配其他任何東西。 ⇒回溯!(.+?)
不符合。 ⇒回溯!我需要學得更多才能夠理解這個例子。我明白'(。+?)'=匹配儘可能最短的字符串,並將其添加到捕獲組,理解'push ...',但不知道爲什麼它重複 - 爲什麼會給出上述結果。我只是一名初學者 - 但謝謝你。 ;) – novacik
'(?!)'不匹配,所以正則表達式引擎通過讓'。+?'匹配更多字符來不斷嘗試找到匹配項。如果失敗,則正則表達式引擎會嘗試在稍後的起始位置進行匹配。這被稱爲「回溯」。正則表達式引擎可以匹配''aaaab'=〜/ a * ab /'。第一次,'a *'匹配所有5個''',所以'ab'不匹配,所以它回溯。第二次,'a *'只匹配4個''',允許'ab'匹配。 – ikegami
...我以爲我知道正則表達式 – kizzx2
不想說謊 - 所以不能說:啊,現在完全明白了。但是,你的解釋給了我一些關於黑暗的光。謝謝。 :)接受。 – novacik
我可以提供更多關於需求的細節;)特別是,正則表達式中的_anchor_意味着什麼。如果你願意,我可以對錨的內部工作給出一個完整的,更詳細的解釋;) – fge