2016-07-04 46 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的原因? –