Regex nur für Zahlen


309

Ich habe überhaupt keine regulären Ausdrücke verwendet, daher habe ich Probleme bei der Fehlerbehebung. Ich möchte, dass der reguläre Ausdruck nur übereinstimmt, wenn die enthaltene Zeichenfolge nur aus Zahlen besteht. Bei den beiden folgenden Beispielen stimmt es jedoch mit einer Zeichenfolge überein, die alle Zahlen plus ein Gleichheitszeichen wie "1234 = 4321" enthält. Ich bin mir sicher, dass es eine Möglichkeit gibt, dieses Verhalten zu ändern, aber wie gesagt, ich habe mit regulären Ausdrücken nie wirklich viel gemacht.

string compare = "1234=4321";
Regex regex = new Regex(@"[\d]");

if (regex.IsMatch(compare))
{ 
    //true
}

regex = new Regex("[0-9]");

if (regex.IsMatch(compare))
{ 
    //true
}

Falls es darauf ankommt, verwende ich C # und .NET2.0.


6
Müssen Sie Zahlen oder Ziffern abgleichen ? Zum Beispiel: 123.456 ist eine Zahl, aber es sind nicht alle Ziffern.
Joel Coehoorn

Genau, OP ist nicht ganz klar über die Verwendung von ganzen Zahlen oder nicht
Sune Rievers

3
Warum nicht TryParse die Zeichenfolge für diesen einfachen Fall? bool decimal.TryParse (Zeichenfolge, out decimal result) oder bool int.TryParse (Zeichenfolge, out int result)
Makach

Schauen Sie sich diese Antwort an, um eine endgültige Behandlung des Parsens von Zahlen mit regulären Ausdrücken zu erhalten.
Tchrist

1
Im Allgemeinen ist die einfachste Möglichkeit zur Fehlerbehebung bei Regex-Ausdrücken meiner Meinung nach die Verwendung eines Befehlszeileninterpreters, sofern Ihre Sprache dies zulässt (anscheinend tun dies die meisten). Da sich dieses Beispiel in C # befindet, können Sie linqpad.net verwenden oder einen Haltepunkt im Debugger verwenden und dann das Direktfenster in VS als CLI verwenden.
Andrew

Antworten:


478

Verwenden Sie die Anfangs- und Endanker.

Regex regex = new Regex(@"^\d$");

Verwenden "^\d+$"Sie diese Option, wenn Sie mehr als eine Ziffer abgleichen müssen.


Beachten Sie, dass andere Ziffern wie die ostarabischen Ziffern "\d"übereinstimmen . Verwenden Sie diese Option, um Übereinstimmungen nur auf die arabischen Ziffern 0 - 9 zu beschränken.[0-9]٠١٢٣٤٥٦٧٨٩"^[0-9]+$"


Wenn Sie andere numerische Darstellungen als nur Ziffern (wie z. B. Dezimalwerte für den Anfang) einfügen müssen , lesen Sie die umfassende Anleitung von @tchrist zum Parsen von Zahlen mit regulären Ausdrücken .


Wie wäre es mit einer festgelegten Anzahl numerischer Werte? Dies gilt normalerweise für Postleitzahlen bestimmter Länder wie Indien. Ich denke, wir müssen danach möglicherweise eine Zeichenfolgenlängenprüfung durchführen.
Najeeb

2
@Najeeb Ja, da indische Postleitzahlen 6-stellige Zahlen sind, können Sie so etwas wie verwenden "^\d{6}$". In einigen anderen Ländern gibt es kompliziertere Regeln für Postleitzahlen, sodass Regex-Lösungen für mehrere Länder ebenfalls ziemlich kompliziert werden können. Schauen Sie sich einige der Beispiele unter stackoverflow.com/q/578406/1288
Bill the Lizard am

Wie kommt es, dass die Eingabezeichenfolge wie folgt lautet: "3 a"? Weiß jemand, wie ich es NUR dann erreichen kann, wenn es Zahlen gibt, und sonst nichts (außer einem negativen Vorzeichen, nehme ich an). Ich habe es derzeit so eingerichtet "-? [0-9] +".
Matthew

105

Ihre Regex stimmt mit allem überein, was eine Zahl enthält. Sie möchten Anker verwenden, um die gesamte Zeichenfolge abzugleichen, und dann eine oder mehrere Zahlen abgleichen:

regex = new Regex("^[0-9]+$");

Das ^verankert den Anfang der Zeichenfolge, das $verankert das Ende der Zeichenfolge und +stimmt mit einem oder mehreren der vorhergehenden Zeichen überein (in diesem Fall mit einer Zahl).


38

Wenn Sie Dezimalstellen und Tausendermarkierungen tolerieren müssen

var regex = new Regex(@"^-?[0-9][0-9,\.]+$");

Sie benötigen ein "-", wenn die Zahl negativ werden kann.


@ Florin Ghita. Vielen Dank. "-" muss am Anfang stehen.
Andy

3
Diese Regex lässt auch fälschlicherweise zu, dass das führende negative Vorzeichen ( -) und die Periode ( .) mehr als einmal auftreten.
DavidRR

5
Sie können über -und .optional über machen ?. -?\d+(?:\.\d+)?würde mit ganzen Zahlen oder Dezimalstellen übereinstimmen. (Die ?:in den Parens machen die Parens nur zu einer nicht erfassenden Gruppe und werden nur aus Gründen der Klarheit verwendet.)
Butterywombat

2
Es schlägt für Randfälle wie 1, .5 fehl, aber wenn Sie das überwachen. dennoch schlägt es für grundlegende Fälle wie -2 fehl. Bitte ändern Sie es so ^-?[0-9][0-9,\.]*$, dass der Grundfall nicht fehlschlägt. + wird ersetzt durch *
PrivateOmega

Ein Szenario, das mir hier fehlt, ist die Engineering-Notation (1.2345e-4).
WolfiG

18

Es stimmt überein, weil es "eine Übereinstimmung" findet, nicht eine Übereinstimmung der vollständigen Zeichenfolge. Sie können dies beheben, indem Sie Ihren regulären Ausdruck so ändern, dass er gezielt nach Anfang und Ende der Zeichenfolge sucht.

^\d+$

16

Vielleicht hilft Ihnen meine Methode.

    public static bool IsNumber(string s)
    {
        return s.All(char.IsDigit);
    }

3
Beachten Sie aber , dass die Char.IsDigitRenditen truefür jedes Zeichen , das ein Mitglied der ist UnicodeCategory.DecimalDigitNumber Kategorie. Dies ist möglicherweise nicht das, was das OP will. Siehe auch Warum Char.IsDigit true für Zeichen zurückgibt, die nicht auf int analysiert werden können. .
DavidRR


16

Dies funktioniert mit Ganzzahlen und Dezimalzahlen. Es stimmt nicht überein, wenn die Zahl das Koma-Tausender-Trennzeichen hat.

"^-?\\d*(\\.\\d+)?$"

Einige Zeichenfolgen, die dazu passen:

894
923.21
76876876
.32
-894
-923.21
-76876876
-.32

einige Saiten, die nicht:

hello
9bye
hello9bye
888,323
5,434.3
-8,336.09
87078.

11

^ \ d + $, was auf Englisch "Anfang der Zeichenfolge", "1 oder mehr Ziffern", "Ende der Zeichenfolge" bedeutet.


10

Wenn Sie überprüfen müssen, ob alle Ziffern die Nummer (0-9) sind oder nicht,

^[0-9]+$

1425 WAHR

0142 WAHR

0 WAHR

1 WAHR

154a25 FALSE

1234 = 3254 FALSE


10

Hier ist meine Arbeit:

^(-?[1-9]+\\d*([.]\\d+)?)$|^(-?0[.]\\d*[1-9]+)$|^0$

Und einige Tests

Positive Tests:

string []goodNumbers={"3","-3","0","0.0","1.0","0.1","0.0001","-555","94549870965"};

Negative Tests:

string []badNums={"a",""," ","-","001","-00.2","000.5",".3","3."," -1","--1","-.1","-0"};

Nicht nur auf C # geprüft, sondern auch mit Java, Javascript und PHP


".3", "3." sind eigentlich gute Zahlen (dh 0,3 bzw. 3,0). Wir sehen dies ständig in Quellsystemen, und die meisten to_number (xx) -Funktionen der von Ihnen erwähnten Sprachen erkennen und konvertieren sie korrekt. Vielen Dank.
Tagar

1
@ Ruslan Sie haben Recht, dass in vielen Systemen ".3", "3." würde auf eine gültige Nummer analysieren und wie von Ihnen erwähnt "0.3" und "3.0" verwenden. Aber andererseits - das ist konvertierter Wert, also ursprünglicher Wert ".3" und "3." ist nicht wirklich existierende Nummer.
Marina K.

9

Entschuldigung für die hässliche Formatierung. Für eine beliebige Anzahl von Ziffern:

[0-9]*

Für eine oder mehrere Ziffern:

[0-9]+

7

Obwohl keine der oben genannten Lösungen meinem Zweck entsprach, funktionierte dies für mich.

var pattern = @"^(-?[1-9]+\d*([.]\d+)?)$|^(-?0[.]\d*[1-9]+)$|^0$|^0.0$";
return Regex.Match(value, pattern, RegexOptions.IgnoreCase).Success;

Beispiel für gültige Werte: "3", "-3", "0", "0,0", "1,0", "0,7", "690,7", "0,0001", "-555", "945465464654"

Beispiel für ungültige Werte: "a", "", "", ".", "-", "001", "00.2", "000.5", ".3", "3.", "-1" , "-1", "-.1", "-0", "00099", "099"


4

Ein anderer Weg: Wenn Sie internationale Zahlen wie Persisch oder Arabisch abgleichen möchten, können Sie folgenden Ausdruck verwenden:

Regex = new Regex(@"^[\p{N}]+$");

Verwenden Sie Folgendes, um das Zeichen für einen wörtlichen Punkt abzugleichen:

Regex = new Regex(@"^[\p{N}\.]+$");

4

Verwenden Sie Anfangs- und Endanker.

 Regex regex = new Regex(@"^\d$");
 Use "^\d+$" if you need to match more than one digit.

3

Regex für Ganzzahl- und Gleitkommazahlen:

^[+-]?\d*\.\d+$|^[+-]?\d+(\.\d*)?$

Eine Nummer kann mit einem Punkt beginnen (ohne führende Ziffern), und eine Nummer kann mit einem Punkt enden (ohne nachfolgende Ziffern). Über Regex werden beide als korrekte Zahlen erkannt.

EIN . (Punkt) selbst ohne Ziffern ist keine korrekte Zahl. Deshalb brauchen wir dort zwei Regex-Teile (getrennt durch ein "|").

Hoffe das hilft.


1
Dies ist die vollständigste Lösung. Glückwunsch!
Renato Medeiros

2

Ich denke, dass dies die einfachste ist und die europäische und US-amerikanische Schreibweise von Zahlen akzeptiert, z. B. USA 10.555,12 Europäisch 10.555.12 Auch diese erlaubt nicht mehrere Kommas oder Punkte nacheinander, z. B. 10..22 oder 10, .22 Zusätzlich zu diesen Zahlen wie .55 oder würde 55 passieren. Dies kann nützlich sein.

^([,|.]?[0-9])+$

1

Wenn Sie nur Zahlen aus einer Zeichenfolge extrahieren möchten, sollte das Muster "\ d +" hilfreich sein.


-4

Regex Regex = neuer Regex ("^ [0-9] {1,4} = [0-9] {1,4] $")


5
Können Sie bitte Ihre Antwort etwas erklären? Sie werden feststellen, dass die anderen Antworten auf diese Frage eine gewisse Erklärung dafür enthalten, was jeder Teil der Regex tut, was Ihnen fehlt.
Wai Ha Lee
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.