2014-09-05 59 views
1

我不知道我是否可以稱這貪婪,但這是一個簡單的正則表達式模式與改變。Regex篡改行爲貪婪

  • 正則表達式:val|get|valueget|eva

  • 文本輸入:aevalueget

在我的理解,應該符合 「VAL」 因爲VAL是在模式中最左邊的表達,它的優先級。由於輸入中有一個匹配的子字符串,它應該匹配「val」並且應該停止進一步搜索。 但在上述案例中的匹配是「eva」,這是模式中最右邊的表達。 實際上,模式中的所有表達式在輸入中都有匹配的子字符串,但似乎它在模式中選擇了最正確的表達式。 我想弄明白這一點。如果有人能夠解釋這種行爲,這將是非常好的。

+2

正則表達式處理器在找到'val'之前找到'eva'。 – 2014-09-05 19:42:51

+0

你好像它確實如此,但爲什麼.. 因爲有或OR不應該它嘗試匹配整個第一個表達式,然後去下一個表達式? – Rasm 2014-09-05 19:52:53

回答

2

發生這種情況的原因是因爲正則表達式處理器正在向下移動字符串,一次嘗試查找匹配項。由於eva在字符串中最左邊,因此在隨後的val處進行比較之前發現它。

而是想象的正則表達式引擎是搜索整個字符串爲val,然後get,然後valueget,然後eva的,它的工作原理更像是這樣的:

|aevalueget 

從這裏開始,它不匹配val,所以它檢查get,然後valueget,然後eva。沒有這些比賽的,所以它移動到下一個位置:

a|evaluget 

從這裏開始,它不匹配valget,或valueget,但它確實比賽eva,因此正則表達式已匹配。

+0

好的。這完全有意義。 – Rasm 2014-09-05 19:55:02

+0

請注意,像'grep'或'awk'這樣的工具會返回較大的結果,即'valueget' – 2014-09-05 23:25:12

2

正則表達式的本性並不像您希望的那樣優先。他們只是遍歷字符串,並嘗試建立匹配,因爲他們看到他們。

如果你想在eva之前匹配val,eval,那麼你需要運行2個正則表達式,1個接一個。第一個用於val,第二個用於eva

+0

或者如果你的正則表達式支持lookarounds,'/ valueget | val | get | eva(?!l)/' – 2014-09-05 19:46:59

+0

我以爲使用OR「|」是單獨匹配.. 第一個表達式或第二個表達式 嘗試匹配第一個表達式如果不匹配然後嘗試匹配第二個表達式...是不是這樣的權利? – Rasm 2014-09-05 19:51:41