Regexp扫描结果

时间:2016-07-04 12:33:29

标签: ruby regex

有人知道为什么我会得到不同的结果,具体取决于模式的顺序吗?

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会根据所用字符串的顺序而改变。

1 个答案:

答案 0 :(得分: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甚至未经过测试。