2016-02-24 9 views

risposta

12

Da sinistra a destra e la prima alternativa corrisponde a "vince", altri non vengono controllati. Questo è un tipico comportamento regex di NFA. Una buona descrizione di tale comportamento è fornita a regular-expressions.info Alternation page.

Nota che RegexOptions.RightToLeft fa in modo che il motore regex esamini la stringa di input da destra a sinistra, il modificatore non influisce sul modo in cui il motore regex elabora il pattern stesso.

Lasciatemi illustrare: se si dispone di una regex (aaa|bb|a) e cercare di trovare una corrispondenza in bbac utilizzando Regex.Match, il valore si ottiene è bb perché a alternativa appare dopo bbb. Se usi Regex.Matches, otterrai tutte le partite e sia bb sia a atterreranno nei risultati.

Inoltre, il fatto che il modello regex sia esaminato da sinistra a destra rende chiaro che all'interno di un gruppo alternativo non ancorato, l'ordine delle alternative è. Se si utilizza un'espressione regolare (a|aa|aaa) per corrispondere a abbccaa, la prima alternativa a corrisponderà a ciascuna a nella stringa (vedere regex demo). Una volta aggiunti i confini delle parole, è possibile posizionare le alternative in qualsiasi ordine (vedere one more regex demo).

+0

Penso che ci siano motori regex che hanno sempre la corrispondenza più lunga, invece del primo qui. – Joey

+2

I motori regex conformi a POSIX richiedono la corrispondenza più lunga. Inoltre, Perl6 '/ pattern1 | pattern2/'corrisponde anche l'alternativa più lunga (esiste un operatore' || 'che funziona come un semplice' | 'nella maggior parte degli altri sapori per produrre la prima alternativa trovata). –