2016-07-04 74 views
3

有沒有人知道爲什麼我得到不同的結果取決於模式的順序?正則表達式掃描結果

list1 = ["AA1", "AA2","AA", "AA+"] 
list2 = ["AA1", "AA2","AA+", "AA"] 
results1 = "somethin with AA+ in it".scan(Regexp.union(list1)) 
results2 = "somethin with AA+ in it".scan(Regexp.union(list2)) 

結果1輸出「AA」 結果2輸出「AA +」

我可misunderstandig如何掃描的作品,但我期待它返回每一次出現,因此這兩個「AA」和「AA +」。另外我不明白爲什麼這個ouptut會根據所使用的字符串的順序而變化。

+0

未錨定的交替組匹配第一個分支,一旦分支匹配其他分支未被測試。 –

+2

我不認爲'Regexp.union()'在做你認爲的事情。它創建一個匹配任何提供的表達式的單一正則表達式。它不會遍歷列表並一次運行一個正則表達式匹配。 – Phylogenesis

回答

8

在NFA正則表達式的替代組中,第一個最左邊的分支「獲勝」。有關更詳細的解釋,請參見Alternation with The Vertical Bar or Pipe Symbol

regexes you have

正則表達式1:(?-mix:AA1|AA2|AA|AA\+)
正則表達式2:(?-mix:AA1|AA2|AA\+|AA)

如果您使用的第一個正則表達式,你AA因爲|AA|支路的第一相匹配,和其他人不反對測試輸入,匹配被返回並且正則表達式索引前進。

第二個正則表達式產生AA+,因爲|AA\+|先匹配,並且返回匹配,則不會測試|AA

+0

一些相關的帖子:[*交替使用創建奇怪的行爲*](http://stackoverflow.com/questions/35987637/alternation-usage-creates-strange-behavior/35987686#35987686)和[*爲什麼正則表達式引擎選擇匹配模式'..X' from'.X | ..X | X.'?*](http://stackoverflow.com/questions/35946342/why-regex-engine-choose-to-match-pattern-x-從-x-xx/35950170#35950170) –

+0

降低投票的理由是豐富每個人的知識的一種方式。什麼是這裏downvote的原因? –