Matching numbers mit regulären Ausdrücken — nur Ziffern und Kommas
Ich kann nicht herausfinden, wie zu konstruieren eines regex für die Beispiel-Werte:
123,456,789
-12,34
1234
-8
Könnten Sie mir helfen?
InformationsquelleAutor der Frage user278618 | 2010-11-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie nur wollen, zu ermöglichen, Ziffern und Komma
^[-,0-9]+$
ist dein regex. Wenn Sie auch zulassen möchten Leerzeichen, verwenden Sie^[-,0-9 ]+$
.Jedoch, wenn Sie wollen, um die zahlen, gehen Sie besser mit etwas wie dieses:
verwenden oder einfach .net die Nummer parser (für die verschiedenen NumberStyles, siehe MSDN):
InformationsquelleAutor der Antwort ThiefMaster
Was ist eine Zahl?
Ich habe eine einfache Frage für Ihre "einfache" Frage: Was genau meinst du mit "eine Zahl"?
−0
einer Reihe?√−1
?⅝
oder⅔
einer Reihe?186,282.42±0.02
km/Sekunde eine Zahl — oder ist es zwei oder drei von Ihnen?6.02e23
einer Reihe?3.141_592_653_589
einer Reihe? Wie wäreπ
oderℯ
? Und−2π⁻³ ͥ
?0.083̄
?128.0.0.1
?⚄
halten? Wie wäre⚂⚃
?10,5 mm
haben eine Zahl in es — oder hat er zwei?∛8³
eine Zahl — oder ist es drei?ↀↀⅮⅭⅭⅬⅫ AUC
darstellen, 2762 oder 2009?४५६७
und৭৮৯৮
zahlen?0377
0xDEADBEEF
und0b111101101
?Inf
einer Reihe? IstNaN
?④②
einer Reihe? Was⓰
?㊅
?ℵ₀
undℵ₁
haben mit zahlen zu tun? Oderℝ
ℚ
undℂ
?Vorgeschlagen Muster
Außerdem sind Sie vertraut mit diesen mustern? Können Sie erläutern die vor-und Nachteile der einzelnen?
/\D/
/^\d+$/
/^\p{Nd}+$/
/^\pN+$/
/^\p{Numeric_Value:10}$/
/^\P{Numeric_Value:NaN}+$/
/^-?\d+$/
/^[+-]?\d+$/
/^-?\d+\.?\d*$/
/^-?(?:\d+(?:\.\d*)?|\.\d+)$/
/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/
/^((\d)(?(?=(\d))|$)(?(?{ord$3==1+ord$2})(?1)|$))$/
/^(?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))$/
/^(?:(?:[0-9a-fA-F]{1,2}):(?:[0-9a-fA-F]{1,2}):(?:[0-9a-fA-F]{1,2}):(?:[0-9a-fA-F]{1,2}):(?:[0-9a-fA-F]{1,2}):(?:[0-9a-fA-F]{1,2}))$/
/^(?:(?:[+-]?)(?:[0123456789]+))$/
/(([+-]?)([0123456789]{1,3}(?:,?[0123456789]{3})*))/
/^(?:(?:[+-]?)(?:[0123456789]{1,3}(?:,?[0123456789]{3})*))$/
/^(?:(?i)(?:[+-]?)(?:(?=[0123456789]|[.])(?:[0123456789]*)(?:(?:[.])(?:[0123456789]{0,}))?)(?:(?:[E])(?:(?:[+-]?)(?:[0123456789]+))|))$/
/^(?:(?i)(?:[+-]?)(?:(?=[01]|[.])(?:[01]{1,3}(?:(?:[,])[01]{3})*)(?:(?:[.])(?:[01]{0,}))?)(?:(?:[E])(?:(?:[+-]?)(?:[01]+))|))$/
/^(?:(?i)(?:[+-]?)(?:(?=[0123456789ABCDEF]|[.])(?:[0123456789ABCDEF]{1,3}(?:(?:[,])[0123456789ABCDEF]{3})*)(?:(?:[.])(?:[0123456789ABCDEF]{0,}))?)(?:(?:[G])(?:(?:[+-]?)(?:[0123456789ABCDEF]+))|))$/
/((?i)([+-]?)((?=[0123456789]|[.])([0123456789]{1,3}(?:(?:[_,]?)[0123456789]{3})*)(?:([.])([0123456789]{0,}))?)(?:([E])(([+-]?)([0123456789]+))|))/
Ich vermute, dass einige dieser Muster oben kann Ihren Bedürfnissen gerecht zu werden. Aber ich kann Ihnen nicht sagen, die oder die, oder, falls nicht vorhanden, liefern Sie ein weiteres—, weil Sie nicht sagte, was meinen Sie mit "Anzahl".
Wie Sie sehen, gibt es eine große Anzahl der Anzahl Möglichkeiten: die wohl ℵ₁ Wert, in der Tat. ☺
Schlüssel zur Vorgeschlagenen Muster
Jedes nummerierte Erläuterung nachfolgend beschrieben, das Muster der entsprechenden nummerierten Muster oben aufgeführt.
\p{Nd}
\p{Decimal_Number}
oder\p{General_Category=Decimal_Number}
. Dies wiederum ist eigentlich nur ein Spiegelbild jener code, der Punkte, deren Numerische Kategorie " Typ " ist Dezimal, die als\p{Numeric_Type=Decimal}
.\w
und\W
\d
und\D
\s
und\S
und\b
oder\B
in das entsprechende Unicode-Eigenschaft. Das bedeutet, Sie müssen nicht verwenden, jede von denen acht ein-Zeichen-escapes für alle Unicode-Daten in Java -, denn Sie arbeiten nur auf ASCII-obwohl Java verwendet immer Unicode-Zeichen intern.jeder Charakter mit der
\pN
,\p{Number}
oder\p{General_Category=Number}
Eigenschaft. Dazu gehören\p{Nl}
oder\p{Letter_Number}
für Dinge wie die römischen Ziffern und die\p{No}
oder\p{Other_Number}
für adscriptum und tiefgestellte Ziffern, Brüche und eingekreisten zahlen — unter anderem, wie das zählen von Stangen.Ⅹ
die römische Ziffer zehn, und⑩
⑽
⒑
⓾
❿
➉
und➓
.\1
capture group, verfügbar machen, als$1
nach dem match gelingt.Quellen und Wartbarkeit
Muster Anzahl 1,2,7–11 stammen aus einer früheren Inkarnation des Perl - Häufig Gestellte Fragen Liste in der Frage, "Wie bestätige ich die Eingabe?". Diesem Abschnitt wurde ersetzt durch einen Vorschlag, der Regexp::Common Modul, geschrieben von Abigail und Damian Conway. Die original-Muster noch im Rezept 2.1 der Perl-Kochbuch"die Prüfung, Ob ein String eine Gültige Zahl", Lösungen, die gefunden werden können, für eine schwindelerregende Reihe von verschiedenen Sprachen, darunter ada, common lisp, groovy, guile, haskell, java, merd, ocaml, php, pike, python, rexx, ruby, und tcl auf der die PLEAC-Projekt.
Muster 12 könnte mehr lesbar umgeschrieben
Es nutzt regex Rekursiondie sich in vielen Muster-Motoren, einschließlich Perl-und alle die PCRE-abgeleiteten Sprachen. Aber es nutzt ein embedded-code Legende, wie der test des zweiten bedingten Muster, meines Wissens, code Legenden sind nur in Perl und PCRE.
Muster 13-21 wurden abgeleitet von den oben genannten Regexp::Common-Modul. Beachten Sie, dass der Kürze wegen, diese sind alle geschrieben, ohne Leerzeichen und Kommentare, die Sie würde definitiv in der Produktion code. Hier ist, wie das Aussehen könnte in
/x
- Modus:Aus Sicht des software engineering, es gibt noch einige Probleme mit dem Stil in der
/x
- mode-version sofort oben. Erstens, es ist viel code Wiederholung, wo sehen Sie die gleichen[0123456789]
; was geschieht, wenn einer dieser Sequenzen versehentlich lässt eine Ziffer aus? Zweitens, Sie befinden sich auf positionale Parameter, mit denen Sie rechnen muss. Das bedeutet, dass Sie vielleicht etwas schreiben wie:ist ehrlich gesagt abscheulich! Es ist einfach, die Nummerierung falsch, schwer zu erinnern, was symbolischen Namen gehen Sie, wo und langweilig zu schreiben, vor allem, wenn Sie brauchen nicht alle Stücke. Umschreiben, benutzt, um benannte Gruppen, anstatt nur nummeriert lieben. Nochmals, ich verwende die Perl-syntax für die Variablen, aber der Inhalt des Musters sollten überall arbeiten, dass die genannten Gruppen werden unterstützt.
Nun die Abstraktionen, die benannt werden, die hilft. Sie können ziehen Sie die Gruppen aus, indem Sie name, und Sie müssen sich nur diejenigen, die Sie interessieren. Zum Beispiel:
Es gibt eine weitere Sache zu tun, dieses Muster, um es noch besser zu warten. Das problem ist, dass es immer noch zu viel Wiederholung, was bedeutet, es ist zu leicht geändert werden, in einem Ort, in einem anderen aber nicht. Wenn Sie Taten, eine McCabe-Analyse, Sie würde sagen, seine Komplexität Metrik ist zu hoch. Die meisten von uns würden nur sagen, es ist auch eingerückt. Dies macht es schwer zu Folgen. Zu lösen alle diese Dinge, was wir brauchen, ist eine "grammatische Muster", ein mit einer definition block zu erstellen benannte Abstraktionen, die wir dann behandeln Sie ein wenig wie ein Unterprogramm Aufruf, der später in die Partie.
Sehen, wie wahnsinnig besser die grammatischen Muster ist als das original-line-laut Muster? Es ist auch weit leichter zu bekommen, die syntax stimmt: ich eingegeben, ohne selbst eine regex-syntax-Fehler, Bedarf der Korrektur. (OK gut, ich tippte alle anderen ohne irgendwelche syntax-Fehler, aber ich habe das getan, für eine Weile. 🙂
Grammatische Muster Aussehen viel mehr wie eine BNF als die hässlichen alten regulären Ausdrücke, dass die Menschen kommen, um Sie zu hassen. Sie sind viel leichter zu Lesen, zu schreiben und zu verwalten. Lassen Sie uns also nicht mehr hässlich Muster, OK?
InformationsquelleAutor der Antwort tchrist
Versuchen Sie dies:
Ermöglicht:
InformationsquelleAutor der Antwort Gary Green
Da diese Frage wurde wieder eröffnet, vier Jahre später, würde ich gerne einen anderen nehmen. Als jemand, der viel Zeit damit verbringt, arbeitet mit regex, meine Ansicht ist diese:
A. Wenn Möglich, nicht mit Regex Zu Validieren Zahlen
Wenn möglich, verwenden Ihre Sprache. Möglicherweise gibt es Funktionen, um Ihnen helfen, festzustellen, ob der Wert enthalten ist ein string eine gültige Zahl ein. That being said, wenn Sie akzeptieren eine Vielzahl von Formaten (Kommata, etc.) Sie dürfen keine Wahl haben.
B. nicht mit dem Schreiben der Regex Manuell zu Überprüfen Nummernkreis
C. Verbringen Sie Ihre Regex Energie mit Bedacht: Verwenden Sie Tools,
Für tools, die Sie verwenden können:
RegexMagic
(nicht kostenlos) von regex-guru Jan Goyvaerts. Es ist seine regex-Anfänger-Produkt, und soweit ich mich erinnere hat es eine große Palette von Optionen für die Generierung von zahlen in einem bestimmten Bereich, unter anderem features.|
D. Übung: erstellen eines Regex für die Angaben in der Frage
Diese Spezifikationen sind ziemlich breit... aber nicht notwendigerweise vage. Schauen wir uns die sample-Werte wieder:
Wie die ersten beiden Werte beziehen? In der ersten, das Komma entspricht Gruppen von Kräfte der drei. In der zweiten, ist es wahrscheinlich entspricht dem Dezimaltrennzeichen in einer continental-European-style-Nummer format. Das bedeutet nicht, wir sollten Ziffern, die überall in
1,2,3,44
. Durch den gleichen token, wir sollten nicht zu restriktiv. Die regex in der akzeptierten Antwort, zum Beispiel, wird nicht mit einer den Anforderungen123,456,789
(siehe demo).Wie bauen wir unsere regulären Ausdruck für die specs?
^
und$
zu vermeiden submatches-?
(?:this|that)
:[1-9][0-9]*(?:,[0-9]+)?
[1-9][0-9]{1,2}(?:,[0-9]{3})+
Die komplette regex:
Sehen demo.
Diese regex nicht erlauben, im europäischen Stil Ziffern, beginnend mit
0
wie0,12
. Es ist ein feature, kein bug. Übereinstimmen, wie auch, ein kleiner tweak:Sehen demo.
InformationsquelleAutor der Antwort zx81
Versuchen Sie dies:
Wird es ermöglichen, eine optionale
-
als erstes Zeichen, und dann eine beliebige Kombination von Komma und Nachkommastellen.InformationsquelleAutor der Antwort Klaus Byskov Pedersen
InformationsquelleAutor der Antwort Andrew
Debuggex Demo
Also, was bedeutet es?!
^
markiert den Anfang des Strings[-+]?
ermöglicht eine minus oder plus direkt nach dem Anfang des Strings(\d{1,3})
entspricht mindestens einem und max drei ({1,3}
) Ziffern (\d
- allgemein[0-9]
) in einer Reihe auf und gruppiert Sie (die parenthesises(...)
baut die Gruppe) als erste Gruppe(,?(?1))*
ok... lassen Sie uns brechen diese nach unten(...)
baut eine andere Gruppe (nicht so wichtig),?
entspricht einem Komma (wenn vorhanden) direkt nach der ersten Folge von Ziffern(?1)
entspricht dem Muster der ersten Gruppe wieder (Sie erinnern sich(\d{1,3})
); in Worten: an diesem Punkt der Ausdruck entspricht einem Zeichen (plus/minus/keine), gefolgt von einer Folge von Ziffern, möglicherweise gefolgt von einem Komma, gefolgt von einer anderen Reihenfolge der Ziffern wieder.(,?(?1))*
die*
wiederholt der zweite Teil (Komma & sequence) so oft wie möglich$
schließlich entspricht das Ende der Zeichenfolgeden Vorteil, solche Ausdrücke zu vermeiden, definieren Sie das gleiche Muster in Ihrem Ausdruck wieder und wieder und wieder... naja, ein Nachteil ist manchmal die Komplexität :-/
InformationsquelleAutor der Antwort bukart
In java, können Sie
java.util.Scanner
mit seinenuseLocale
MethodeInformationsquelleAutor der Antwort Jorge DeFlon Developer
Für die Beispiele:
Sollte es funktionieren. Implementieren Sie, in welcher Sprache Sie wollen.
InformationsquelleAutor der Antwort arunKr
Versuchen Sie dies:
Dieser RegEx entsprechen nur Ziffern, Punkte und Kommas.
InformationsquelleAutor der Antwort Narasimha