3 votes

Résultats du Regexp Scan

Quelqu'un sait-il pourquoi j'obtiens des résultats différents selon l'ordre des motifs ?

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))

Le résultat 1 donne "AA". Résultats 2 : "AA+"

Je ne comprends peut-être pas bien comment fonctionne le scan, mais je m'attendais à ce qu'il renvoie chaque occurrence, d'où les deux "AA" et "AA+". De plus, je ne comprends pas pourquoi le résultat change en fonction de l'ordre des chaînes de caractères utilisées.

8voto

Wiktor Stribiżew Points 100073

Dans un groupe d'alternance en regex NFA, la première branche la plus à gauche "gagne". Voir Alternance avec le symbole de la barre verticale ou du tuyau pour une explication plus détaillée.

El les regex que vous avez sont

Regex 1 : (?-mix:AA1|AA2|AA|AA\+)
Regex 2 : (?-mix:AA1|AA2|AA\+|AA)

Si vous utilisez la première regex, vous obtenez AA parce que |AA| correspond à la première branche, et les autres ne sont pas testées par rapport à l'entrée, la correspondance est retournée et l'index de regex avance.

La deuxième regex donne AA+ parce que le |AA\+| correspond d'abord, et la correspondance est renvoyée, |AA n'est même pas testé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X