有人知道为什么我会得到不同的结果,具体取决于模式的顺序吗?
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 +”
我可能会误解扫描是如何工作的,但我希望它能在每次出现时返回,因此“AA”和“AA +”都会出现。另外,我不明白为什么ouptut会根据所用字符串的顺序而改变。
答案 0 :(得分:8)
在NFA正则表达式的交替组中,第一个最左边的分支“获胜”。有关更详细的说明,请参阅Alternation with The Vertical Bar or Pipe Symbol。
正则表达式1:(?-mix:AA1|AA2|AA|AA\+)
正则表达式2:(?-mix:AA1|AA2|AA\+|AA)
如果使用第一个正则表达式,则得AA
因为|AA|
分支首先匹配,而其他分支未针对输入进行测试,则返回匹配并且正则表达式索引前进。
第二个正则表达式产生AA+
,因为|AA\+|
首先匹配,并且返回匹配,|AA
甚至未经过测试。