2016-02-24 13 views

Odpowiedz

12

lewej do prawej, a pierwsza alternatywa dopasowane „wygrywa”, inni nie są sprawdzane. Jest to typowe zachowanie w wyrażeniu regularnym NFA. Dobry opis tego zachowania znajduje się pod adresem regular-expressions.info Alternation page.

Zauważ, że RegexOptions.RightToLeft sprawia tylko silnik regex zbadać ciąg wejściowy z prawej do lewej, modyfikator nie wpływa jak silnik regex przetwarza sam wzór.

Pozwól mi zilustrować: jeśli masz (aaa|bb|a) regex i spróbować znaleźć odpowiednika w bbac korzystając Regex.Match wartość otrzymasz jest bb bo po bbba alternatywą wydaje. Jeśli używasz Regex.Matches, dostaniesz wszystkie mecze i oba bb i a wyląduje w wynikach.

Również fakt, że wzór regex jest badany od lewej do prawej, wyjaśnia, że ​​w niezablokowanej grupie alternatywnej, kolejność alternatyw ma znaczenie. Jeśli używasz (a|aa|aaa) regex dopasować przeciwko abbccaa, pierwszy a alternatywą będzie dopasowanie każdego a w ciągu znaków (patrz regex demo). Po dodaniu granic słów możesz umieścić je w dowolnej kolejności (patrz one more regex demo).

+0

Myślę, że istnieją regex silników, które zawsze biorą najdłuższy mecz, zamiast najpierw tutaj. – Joey

+2

Silniki regex zgodne z POSIX wymagają najdłuższego dopasowania. Również Perl6// pattern1 | pattern2/"pasuje również do najdłuższej alternatywy (jest operator' || ', który działa jak proste' | 'w większości innych smaków, aby uzyskać pierwszą znalezioną alternatywę). –