2016-02-24 12 views

Antwort

12

Von links nach rechts, und die erste Alternative abgestimmt "gewinnt", andere sind nicht überprüft. Dies ist ein typisches NFA-Regex-Verhalten. Eine gute Beschreibung dieses Verhaltens ist unter regular-expressions.info Alternation page verfügbar.

Beachten Sie, dass RegexOptions.RightToLeft die Regex-Engine nur dazu bringt, die Eingabezeichenfolge von rechts nach links zu untersuchen. Der Modifizierer hat keinen Einfluss darauf, wie die Regex-Engine das Muster selbst verarbeitet.

Lassen Sie mich erläutern: Wenn Sie eine (aaa|bb|a) regex haben und versuchen, eine Übereinstimmung in bbac mit Regex.Match zu finden, der Wert, den Sie erhalten werden, ist bb weil a Alternative nach bbb erscheint. Wenn Sie Regex.Matches verwenden, erhalten Sie alle Übereinstimmungen, und sowohl bb als auch a landen in Ihren Ergebnissen.

Auch die Tatsache, dass das Regex-Muster von links nach rechts untersucht wird, macht deutlich, dass in einer nicht verankerten alternativen Gruppe die Reihenfolge der Alternativen ist. Wenn Sie einen (a|aa|aaa) Regex verwenden, der mit abbccaa übereinstimmt, entspricht die erste a Alternative jedem a in der Zeichenfolge (siehe regex demo). Sobald Sie Wortgrenzen hinzugefügt haben, können Sie die Alternativen in beliebiger Reihenfolge platzieren (siehe one more regex demo).

+0

Ich denke, es gibt Regex-Motoren, die immer die längste Übereinstimmung, statt der ersten hier nehmen. – Joey

+2

POSIX-konforme Regex-Engines erfordern die längste Übereinstimmung. Auch Perl6 '/ pattern1 | pattern2/'passt auch zur längsten Alternative (es gibt einen' || 'Operator, der in den meisten anderen Varianten als einfaches' | 'funktioniert, um die erste gefundene Alternative zu erhalten). –

Verwandte Themen