Regex, um zwei- oder viermal mit einer Ziffer übereinzustimmen

94

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.

Renato Dinhani
quelle
Zum Beispiel, um einem zwei- oder vierstelligen Jahr zu entsprechen .
DavidRR
Was möchten Sie mit der if-Zeichenfolge tun abc 123 xyz? Sollte es übereinstimmen, 12weil das genau zwei Ziffern hintereinander sind? Oder sollte es nicht, weil 12es Teil einer größeren Ziffernfolge ist, 123die 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ür abc 12345 def... was soll da passieren?
Jean-François Corbett

Antworten:

142

Dafür gibt es keine spezifische Syntax, aber es gibt viele Möglichkeiten, dies zu tun:

(?:\d{4}|\d{2})    <-- alternation: four digits or two
\d{2}(?:\d{2})?    <-- two digits, and optionally two more
(?:\d{2}){1,2}     <-- two digits, times one or two
Ruakh
quelle
1
Persönlich dachte ich nur sofort an die \d{2}(?:\d{2})?Lösung - eine schöne Auswahl davon -, insbesondere die letzte, die sehr schön und skalierbar erscheint.
Nightfirecat
3
+1, um die Reihenfolge zu berücksichtigen, die erforderlich ist, wenn die Abwechslung verwendet wird, um zuerst 4 Stellen und dann 2 Stellen abzugleichen. Auch gute Arbeit mit den anderen Variationen.
Ahmad Mageed
9
Für alle, die wie ich die Verwendung nicht verstanden haben, wird (?: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
Jeremy Moritz
Diese zeigen das gleiche Ergebnis für "333" und "33"
Dan
1
@ Dan: Diese regulären Ausdrücke stimmen nicht mit der vollständigen Zeichenfolge überein "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.
Ruakh
3
(?<!\d)(\d{2}|\d{4})(?!\d)

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:

^\d{4}$|^\d{2}$
JGFMK
quelle
1
Ich würde nicht sagen, dass die akzeptierte Antwort falsch ist. Ich würde sagen, dass die Frage unklar ist und dass diese Antwort eine gültige Interpretation davon anspricht. Ihre Antwort befasst sich mit einer anderen gültigen Interpretation (die ich für wahrscheinlicher halte - aber anscheinend hat der Fragesteller dies nicht getan ...).
Jean-François Corbett
2
"Es würde mit 3 Ziffern übereinstimmen" ist nicht ganz genau. Ich denke, Sie meinen "Es würde einer zweistelligen Teilsequenz einer dreistelligen Sequenz entsprechen."
Jean-François Corbett
1
Außerdem funktioniert Ihre Antwort bei Sequenzen mit 5 oder mehr Ziffern nicht ganz wie beabsichtigt . Ich bin kein Regex-Experte, aber ich denke, eine Möglichkeit, dies zu beheben, besteht darin, den negativen Lookahead / Behind auf beide Fälle anzuwenden (2- und 4-stellige Sequenzen):(?<!\d)(\d{2}|\d{4})(?!\d)
Jean-François Corbett,
Ich denke, Sie haben Recht mit den 5 Ziffern. Danke für diese Korrektur. Wird das beheben.
JGFMK
^\d{4}$|^\d{2}$wäre ein möglicher Weg, um das zu beheben. Wie würde^\d{2}(?!\d)|^\d{4}(?!\d)
JGFMK