2009-09-04 17 views
27

Wie schreibt man einen regulären Ausdruck, der einem numerischen Bereich von 0 oder 000 bis 180 entspricht?Regulärer Ausdruck: Numerischer Bereich

+1

http://www.regular-expressions.info/numericranges.html ist ein sehr nützlicher Artikel – Bergi

+0

Ich glaube, Sie dieses Paket verwenden kann, 'https: // github.com/dimka665/range-regex'. Es unterstützt bereits negative Werte. Der aktuelle Code wird nicht aktualisiert. Sie müssen ihn daher von dieser Github-Ressource herunterladen. – swdev

Antwort

28

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

Um dies zu tun mit reinen regex Sie das Muster identifizieren müssen und es schreiben:

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

Dies hat drei Alternativen: ein für ein- und zweistellige Zahlen (so dass führende Nullen), wobei jeder Ziffer kann alles von 0 bis 9 sein. Und eine andere, die angibt, welcher Bereich von Ziffern für jede Ziffer in einer dreistelligen Zahl erlaubt ist. 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.

könnte ein einfacher Ansatz

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

sein, die für jeden kniffligen Zahlenbereich wechselt nur sein könnte dort.

+0

Das macht den Trick.Wie Sie auch erwähnt haben, muss es dreistellige Zahlen wie 001, 010, 012 usw. entsprechen, was das tut.Geschätzte – Morten

2

Versuchen Sie folgendes:

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

Weder für eine dreifache '000'. –

+0

@Ionut G. Stan: Ich denke, das ist nur die Alternative, wenn nur Zahlen ohne führende Nullen zu schwierig sind. – Gumbo

32

Ich glaube nicht, regex die richtige Wahl für diese 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 in Code überprüfen.

+8

+1 Die anderen Antworten hatten jeweils mindestens einen Fehler, deshalb lohnt es sich nicht, RE für diese Aufgaben zu verwenden. – soulmerge

+3

Zwei Fehler sogar :(aber ja, ich stimme grundsätzlich zu. – Joey

+1

In jedem anderen Kontext könnte es einfacher gewesen sein, einen Wert zu parsen, aber es wird in einem größeren Regex verwendet, der eine Koordinate wie 54 ° passiert. 11'56.234 '' – Morten

0

I modifizierte Gumbos:

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

bereite.

0

, wenn Sie nicht über negative Zahlen egal

>> 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] 
>> 
18

Es ist ein Online-Dienstprogramm diese at UtilityMill.com Für Ihre Frage zu generieren, diese zurückgibt:

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

Als allgemeine Regel würde ich einer Regex nicht vertrauen geschrieben von einem Programm Meine Erfahrungen mit RegexBuddy haben gezeigt, dass es nicht mein "Freund" ist, noch kann es anständige reguläre Ausdrücke schreiben. –

+0

Dieser ist co aber richtig. Es erlaubt zwar beliebig viele führende Nullen. – Joey

+0

@ paul-mcguire ist es möglich, Kommas zu ignorieren, wenn der Benutzer versucht, Werte wie 1.000 einzugeben? – Vyache

1

Ich würde die Bereiche aufgliedern so dass es leicht in separaten individuellen Regex angegeben werden kann:

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

Oder was in den Menschen lesbaren Begriffen ist das gleiche:

 
0 
000-099 
100-179 
180 

Wenn Sie den zweistelligen Bereich benötigen, ist es nur eine Frage der [0-9][0-9] auf die regex hinzuzufü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 Funktion viel klarer wird. speziell, wenn die Sprache, in der Sie dies tun, Sie Teile der Regex-Spezifikation in separate Spalten und Zeilen trennen können.

+0

Sie haben die Ziffern 1 bis 9 vergessen. –

+0

Nein, ich habe gerade "0 oder 000 bis 180" gelesen und interpretiert: 0 als eine Ziffer oder der Bereich 000 bis 180 als drei Ziffern. Als ich sagte: "Wenn Sie die zweistellige Reichweite brauchen ..." hätte ich auch den einstelligen Bereich erwähnen sollen, damit sind Sie richtig. – lcv

3

Meine zwei Cent:

Wer eine Antwort auf diese Frage Entsendung sollten ihre regex mit mindestens die folgenden Eingänge haben getestet:

entsprechen sollten: 0, 00, 000, 5, 05, 005, 95, 095, 180

nicht überein Sollte: 0000, 0095, 181, 190

denke ich, Johannes Rössel was schrieb ungefähr so ​​gut ist, wie Sie bekommen:

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

PowerShell hilft beim Validieren: '-20..200 |% {$ _;" {0:00} "- f $ _;" {0: 000} "- f $ _} |% {if ($ _- match "^ (0? [0-9] {1,2} | 1 [0-7] [0-9] | 180) $") {Schreib-Host -fore grün $ _} else {Schreib-Host - vor rot $ _}} ' – Joey

13

Die kürzlich veröffentlichte rgxg Kommandozeilen-Tool erzeugt reguläre Ausdrücke, die einen bestimmten Nummernbereich entsprechen:

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

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

0

Sie können die regelmäßigen unten verwenden Ausdruck

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

Wenn Sie es genau drei Ziffern brauchen, können Sie entfernen? Zeichen –