Regulärer Ausdruck: Numerischer Bereich

Wie schreibt man einen regulären Ausdruck, der einem Zahlenbereich von 0 oder 000 bis 180 entspricht?

   

Der einfachste Weg wäre, die Zeichenfolge als Zahl zu analysieren und nach der Zahl zu suchen, die im richtigen Bereich liegt.

Um dies mit reinem Regex zu tun, müssen Sie das Muster identifizieren und aufschreiben:

 ^(0?[0-9]{1,2}|1[0-7][0-9]|180)$ 

Dies hat drei Alternativen: eine für ein- und zweistellige Nummern (erlaubt führende Nullen), wobei jede Ziffer von 0 bis 9 sein kann. Eine weitere gibt an, welcher Bereich von Ziffern für jede Ziffer in einer dreistelligen Zahl erlaubt ist Nummer. In diesem Fall bedeutet dies, dass die erste Ziffer 1 sein muss, die zweite Ziffer zwischen 0 und 7 und die letzte Ziffer alles. Die dritte Alternative ist nur für die Nummer 180, die anderswo nicht gut in das Muster passte.

Ein direkterer Ansatz könnte sein

 ^(0{0,2}[0-9]|0?[1-9][0-9]|1[0-7][0-9]|180)$ 

welches nur für jeden schwierigen numerischen Bereich abwechselt.

Ich denke nicht, dass Regex die richtige Wahl dafür ist. Haben Sie versucht, den Wert zu analysieren? Wenn Sie Regex verwenden müssen, würde ich \d{1,3} die Zeichenfolge parsen und dann die Nummer im Code validieren.

Es gibt ein Online-Dienstprogramm, um diese auf UtilityMill.com zu generieren. Für Ihre Frage gibt das zurück:

 0*([0-9]{1,2}|1[0-7][0-9]|180) 

Das kürzlich veröffentlichte rgxg generiert reguläre Ausdrücke, die einem bestimmten Nummernbereich entsprechen:

 $ rgxg range -Z 0 180 (180|1[0-7][0-9]|0?[0-9]{1,2}) 

Weitere Informationen finden Sie unter http://rgxg.sf.net .

Meine zwei Cent:

Wer eine Antwort auf diese Frage postet, sollte seine Regex mit AT LEAST die folgenden Eingaben getestet haben :

Sollte übereinstimmen: 0, 00, 000, 5, 05, 005, 95, 095, 180

Sollte NICHT übereinstimmen: 0000, 0095, 181, 190

Ich denke, was Johannes Rössel geschrieben hat, ist so gut, wie du es bekommen wirst:

 ^(0?[0-9]{1,2}|1[0-7][0-9]|180)$ 

Versuche dies:

 ^(0|[1-9][0-9]?|1[0-7][0-9]|180)$ 

Ich würde die Bereiche aufteilen, so dass es leicht in separaten einzelnen Regex angegeben werden kann:

^(0|0[0-9][0-9]|1[0-7][0-9]|180)$

Oder, was in menschenlesbaren Begriffen gleich ist:

 0
 000-099
 100-179
 180

Wenn Sie den zweistelligen Bereich benötigen, müssen Sie nur [0-9][0-9] zur Regex hinzufügen.

Wenn Sie Probleme bei der Arbeit mit Regex haben, versuchen Sie, sie so zu spezifizieren, dass die Regex-Operatoren so klar wie möglich sind – normalerweise gibt es eine Möglichkeit, sie so darzustellen, dass ihre function viel klarer wird, besonders in der Sprache Dies ermöglicht Ihnen, Teile der Regex-Spezifikation in separate Spalten und Zeilen zu trennen.

wenn du dich nicht um negative Zahlen kümmerst

 >> r = /\b(0?\d?\d|1[0-7]\d|180)\b/ => /\b(0?\d?\d|1[0-7]\d|180)\b/ >> (0..200).map {|i| i.to_s =~ r } => [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil] >> 

Sie können den folgenden regulären Ausdruck verwenden

 ^([0-1]?[0-7]?[0-9])|180$ 

Ich habe Gumbo’s modifiziert:

 ^(00?0?|0?[1-9][0-9]?|1[0-7][0-9]|180)$ 

Versuch das.