Betrachten Sie den folgenden regulären Ausdruck, in dem X
sich ein regulärer Ausdruck befindet .
X{n}|X{m}
Diese Regex würde testen, X
ob genau n
oderm
Zeiten.
Gibt es einen Regex-Quantifizierer, der X
genau n
oder zu bestimmten m
Zeiten auf ein Vorkommen testen kann ?
X
ist das Beste, was Sie für allgemein bekommenm
könnenn
.(X)\1{n-1}(?:\1{m-n-1})
. Ich weiß, dass diesX
mindestens einmal übereinstimmt, aber um zu beginnen, probieren Sie diese einfache Sache aus und verfeinern Sie sie, indem Sie stattdessen Lookaheads oder Lookbehinds verwenden(X)
.Antworten:
Es gibt keinen einzelnen Quantifizierer, der "genau m oder n Mal" bedeutet. Die Art und Weise, wie Sie es tun, ist in Ordnung.
Eine Alternative ist:
wo
m < n
undk
ist der Wert vonn-m
.quelle
Hier ist die vollständige Liste der Quantifizierer (siehe http://www.regular-expressions.info/reference.html ):
?
,??
- 0 oder 1 Vorkommen (??
ist faul,?
ist gierig)*
,*?
- beliebig viele Vorkommen+
,+?
- mindestens ein Vorkommen{n}
- genaun
Vorkommen{n,m}
-n
zum
Ereignissen, einschließlich{n,m}?
-n
zum
Ereignissen, faul{n,}
,{n,}?
- zumindestn
VorkommenUm "genau N oder M" zu erhalten, müssen Sie den quantifizierten regulären Ausdruck zweimal schreiben, es sei denn, m, n sind speziell:
X{n,m}
wennm = n+1
(?:X{n}){1,2}
wennm = 2n
quelle
?:
im if-m = 2n
Beispiel benötigt? Scheint ohne es gut für mich zu funktionieren.?:
, wird die Gruppe zu einer Erfassungsgruppe. Abgesehen davon, dass sich die Regex-Engine an Dinge erinnert, die sie nicht benötigt, ändern sich ihre IDs, wenn Sie nach dieser Gruppe Gruppen erfassen. Wenn Sie Ihren regulären Ausdruck als Ersatz verwenden, müssen Sie den Ersatz anpassen.Nein, es gibt keinen solchen Quantifizierer. Aber ich würde es umstrukturieren
/X{m}(X{m-n})?/
, um Probleme beim Zurückverfolgen zu vermeiden .quelle
TLDR;
(?<=[^x]|^)(x{n}|x{m})(?:[^x]|$)
Sieht so aus, als ob Sie "xn-mal" oder "xm-mal" möchten. Ich denke, eine wörtliche Übersetzung in Regex wäre
(x{n}|x{m}).
wie folgt: https://regex101.com/r/vH7yL5/1oder in einem Fall, in dem Sie eine Folge von mehr als m "x" haben können (unter der Annahme von m> n), können Sie "nach keinem" x "und" gefolgt von keinem "x" hinzufügen, was übersetzt bedeutet,
[^x](x{n}|x{m})[^x]
aber das würde Nehmen Sie an, dass sich hinter und nach "x" immer ein Zeichen befindet. Wie Sie hier sehen können: https://regex101.com/r/bB2vH2/1Sie können es in
(?:[^x]|^)(x{n}|x{m})(?:[^x]|$)
"nach keinem 'x' oder nach dem Zeilenanfang" und "gefolgt von keinem 'x' oder gefolgt vom Zeilenende" ändern . Es werden jedoch nicht zwei Sequenzen mit nur einem Zeichen zwischen ihnen abgeglichen (da für die erste Übereinstimmung ein Zeichen danach und für die zweite ein Zeichen vorher erforderlich wäre), wie Sie hier sehen können: https://regex101.com/r/ oC5oJ4 / 1Um die Übereinstimmung mit einem Zeichen in der Ferne zu finden, können Sie einen positiven Blick nach vorne (? =) Auf das "no 'x' after" oder einen positiven Blick nach hinten (? <=) Auf das "no 'x' before" hinzufügen. wie folgt: https://regex101.com/r/mC4uX3/1
Auf diese Weise stimmen Sie nur mit der genauen Anzahl der gewünschten 'x' überein.
quelle
Wenn sie sich Enhardeneds Antwort ansehen, stellen sie fest, dass ihr vorletzter Ausdruck nicht mit Sequenzen mit nur einem Zeichen zwischen ihnen übereinstimmt. Es gibt eine einfache Möglichkeit, dies zu beheben, ohne nach vorne / nach hinten schauen zu müssen. Dabei wird das Start- / Endzeichen durch das Begrenzungszeichen ersetzt. Auf diese Weise können Sie mit Wortgrenzen abgleichen, einschließlich Start / Ende. Als solches sollte der geeignete Ausdruck sein:
(?:[^x]|\b)(x{n}|x{m})(?:[^x]|\b)
Wie Sie hier sehen können: https://regex101.com/r/oC5oJ4/2 .
quelle
Sehr alter Beitrag, aber ich möchte etwas beitragen, das hilfreich sein könnte. Ich habe es genau so versucht, wie es in der Frage angegeben ist, und es funktioniert, aber es gibt einen Haken: Die Reihenfolge der Mengen ist wichtig. Bedenken Sie:
Dadurch werden alle Vorkommen von Hex-Farbcodes gefunden (sie sind entweder 3 oder 6 Stellen lang). Aber wenn ich es so umdrehe
Es werden nur die 3-stelligen oder die ersten 3-stelligen der 6-stelligen gefunden. Dies ist zwar sinnvoll und ein Regex-Profi kann dies sofort erkennen, für viele ist dies jedoch ein eigenartiges Verhalten. Es gibt einige erweiterte Regex-Funktionen, die diese Falle unabhängig von der Reihenfolge vermeiden können, aber nicht jeder ist knietief in Regex-Mustern.
quelle