Was ist der Unterschied zwischen Regex {m, n} und (regex) {m, n}?

8

Ich entwickle ein Docker-Projekt, muss eine Regex schreiben, um den Repository-Namen zu überprüfen. Anforderung wie folgt:

  1. enthält nur ASCII-Zeichen, exclude upcase.
  2. Sonderzeichen schließen aus, außer für Punkt (.), Bindestrich (-) und Unterstrich (_).
  3. beginne nur mit Alphabet und Zahl und beende auch damit.
  4. spezielle Charakters können nicht kontinuierlich erscheinen.
  5. Längenbegrenzung (min: 2, max: 255)

Dann ist meine Regex:

%Vor%

Es kann jedoch nicht OK sein, wenn der Name des Repositorys e-e_1.1

lautet

Wenn ich es ändere zu:

%Vor%

es ist OK.

Gibt es jemanden, der das erklären kann? Vielen Dank im Voraus.

    
xautjzd 29.02.2016, 08:42
quelle

1 Antwort

8

Im ([a-z0-9]+(?:[._-][a-z0-9]+)*){2,255} Regex wird der begrenzende Quantor {2,255} auf das gesamte Muster in Gruppe 1 ( [a-z0-9]+(?:[._-][a-z0-9]+)* ) angewendet. Es bedeutet, dass es 2 bis 255 mal wiederholt werden kann. Es bedeutet nicht, dass die gesamte Stringlänge auf 2 bis 255 Zeichen beschränkt ist.

Nun kann Ihre [a-z0-9]+(?:[._-][a-z0-9]+)*{2,255} Regex auch unbegrenzte Zeichen enthalten, da die mit [a-z0-9]+ übereinstimmende Zeichenfolge 1 oder mehr Zeichen haben kann. (?:[._-][a-z0-9]+)* kann null oder mehr Zeichen enthalten. Der begrenzende Quantor {2,255} funktioniert hier nicht so wie Sie es brauchen.

Um die Länge der Eingabezeichenfolge auf 2 bis 255 Zeichen zu beschränken, müssen Sie ein Lookahead verwenden, das am Anfang verankert ist:

%Vor%

Der (?=.{2,255}$) lookahead wird nur einmal am Anfang des Strings ausgeführt und eine Übereinstimmung wird nur gefunden, wenn die Bedingung im Lookahead erfüllt ist: es müssen 2 bis 255 Zeichen sein ( . stimmt mit anderen Zeichen überein) als ein Newline, aber es ist nicht wichtig, da Sie nur bestimmte Zeichen im übereinstimmenden Muster später erlauben) bis zum Ende der Schnur.

    
Wiktor Stribiżew 29.02.2016 08:52
quelle

Tags und Links