Es ist eine einfache Frage zu regulären Ausdrücken, aber ich finde keine Antwort.
Ich möchte feststellen, ob eine Zahl genau zwei- oder viermal hintereinander erscheint. Welche Syntax kann ich verwenden?
\d{what goes here?}
Ich habe es versucht \d{2,4}
, aber dieser Ausdruck akzeptiert auch drei Ziffern.
abc 123 xyz
? Sollte es übereinstimmen,12
weil das genau zwei Ziffern hintereinander sind? Oder sollte es nicht, weil12
es Teil einer größeren Ziffernfolge ist,123
die selbst weder 2 noch 4 lang ist? Wenn ich raten müsste, würde ich denken, dass Sie das letztere Verhalten wollen, aber es ist nicht klar aus Ihrer Frage. Beispiele und / oder eine klarere Spezifikation würden helfen. Gleiche Frage fürabc 12345 def
... was soll da passieren?Antworten:
Dafür gibt es keine spezifische Syntax, aber es gibt viele Möglichkeiten, dies zu tun:
quelle
\d{2}(?:\d{2})?
Lösung - eine schöne Auswahl davon -, insbesondere die letzte, die sehr schön und skalierbar erscheint.(?:
eine "nicht erfassende Gruppe" gestartet (eine Gruppe, auf die in einer Ersetzungsanweisung nicht verwiesen werden soll). Sie können auch nur Parens verwenden, aber diese erstellen eine Erfassungsgruppe. Weitere Details hier: stackoverflow.com/questions/3512471/non-capturing-group"333"
. Möglicherweise verwenden Sie versehentlich die Funktion "Suche nach passenden Teilzeichenfolgen" Ihrer Regex-Bibliothek und nicht die Funktion "Überprüfen, ob die vollständige Zeichenfolge übereinstimmt". Sie sollten die Dokumentation konsultieren.Dies ist der richtige Weg. Die akzeptierte Antwort ist falsch.
Es würde 3 Ziffern (oder 5) entsprechen. Das ist also in meinen Augen falsch .
1) Überprüfen Sie, ob vor einer Folge von 2 oder 4 Ziffern oder nach einer Folge von zwei oder vier Ziffern keine Ziffer vorhanden ist.
(<!)
Die Syntax ist negativ(?!)
Die Syntax ist negativ.Das Obige würde für die mittlere Saite funktionieren:
Wenn Ihre Suchzeichenfolge keinen Inhalt enthält, können Sie die Anker
^
und$
Anfang und Ende der Zeichenfolge verwenden:quelle
(?<!\d)(\d{2}|\d{4})(?!\d)
^\d{4}$|^\d{2}$
wäre ein möglicher Weg, um das zu beheben. Wie würde^\d{2}(?!\d)|^\d{4}(?!\d)