Regex solo per numeri


309

Non ho usato espressioni regolari, quindi ho difficoltà a risolvere i problemi. Voglio che il regex corrisponda solo quando la stringa contenuta è composta da tutti i numeri; ma con i due esempi in basso corrisponde una stringa che contiene tutti i numeri più un segno di uguale come "1234 = 4321". Sono sicuro che c'è un modo per cambiare questo comportamento, ma come ho detto, non ho mai fatto molto con le espressioni regolari.

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

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

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

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

Nel caso in cui sia importante, sto usando C # e .NET 2.0.


6
Devi abbinare numeri o cifre ? Ad esempio: 123.456 è un numero, ma non sono tutte cifre.
Joel Coehoorn,

Esatto, OP non è del tutto chiaro sull'uso di numeri interi o no
Sune Rievers,

3
Perché non provare a analizzare la stringa per quel semplice caso? bool decimal. TryParse (stringa stringa, risultato decimale in uscita) o bool int. TryParse (stringa stringa, risultato int in uscita)
Makach

Guarda questa risposta per un trattamento definitivo dell'analisi dei numeri con espressioni regolari.
tchrist,

1
In generale, il modo più semplice per risolvere i problemi relativi alle espressioni Regex, secondo me, è usare un interprete da riga di comando, se la tua lingua lo consente (sembra che la maggior parte lo faccia). Poiché questo esempio è in C #, è possibile utilizzare linqpad.net oppure è possibile utilizzare un punto di interruzione nel debugger e quindi utilizzare la finestra Immediata in VS come CLI.
Andrew

Risposte:


478

Utilizzare le ancore di inizio e fine.

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

Utilizzare "^\d+$"se è necessario abbinare più di una cifra.


Nota che "\d"corrisponderà [0-9]e altri caratteri numerici come i numeri arabi orientali ٠١٢٣٤٥٦٧٨٩. Utilizzare "^[0-9]+$"per limitare le corrispondenze solo ai numeri arabi 0 - 9.


Se è necessario includere rappresentazioni numeriche diverse dalle sole cifre (come i valori decimali per i principianti), consultare la guida completa di @tchrist per l'analisi dei numeri con espressioni regolari .


Che ne dici di un determinato numero di valori numerici? Questo di solito è così per i codici postali di alcuni paesi come l'India. Immagino che potremmo dover fare un controllo della lunghezza della stringa dopo questo?
Najeeb,

2
@Najeeb Sì, poiché i codici postali indiani sono numeri di 6 cifre, puoi usare qualcosa del genere "^\d{6}$". Alcuni altri paesi hanno regole più complicate per i codici postali, quindi anche le soluzioni regex per più paesi possono diventare piuttosto complicate. Guarda alcuni degli esempi su stackoverflow.com/q/578406/1288
Bill the Lizard,

Come mai se la stringa di input è qualcosa del tipo: "3 a" corrisponderà ancora? Qualcuno sa come posso farlo corrispondere SOLO se ci sono numeri e nient'altro (tranne per un segno negativo suppongo). Al momento l'ho impostato in questo modo "-? [0-9] +".
Matteo,

105

Il tuo regex corrisponderà a tutto ciò che contiene un numero, vuoi usare gli ancoraggi per abbinare l'intera stringa e quindi abbinare uno o più numeri:

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

Il ^ancorerà L'inizio della stringa, la $ancorerà alla fine della stringa, e +corrisponderà uno o più di ciò che lo precede (un numero in questo caso).


38

Se è necessario tollerare il punto decimale e il contrassegno mille

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

Avrai bisogno di un "-", se il numero può diventare negativo.


@Florin Ghita. Grazie. "-" deve essere all'inizio.
Andy,

3
Questa regex consente inoltre erroneamente che il segno negativo iniziale ( -) e il punto ( .) si verifichino più di una volta.
DavidRR

5
è possibile effettuare -e .facoltativo tramite ?. -?\d+(?:\.\d+)?corrisponderebbe a numeri interi o decimali. (Il ?:in the parens rende le paren solo un gruppo non catturante e utilizzato solo per raggruppare per chiarezza.)
butterywombat

2
Non funziona per casi limite come 1, .5, ma se lo controlli. tuttavia fallisce per casi di base come -2. Si prega di modificarlo ^-?[0-9][0-9,\.]*$per evitare di fallire nel caso di base. + viene sostituito con *
PrivateOmega

Uno scenario che mi manca qui è la notazione di ingegneria (1.2345e-4) qualche suggerimento al riguardo?
WolfiG,

18

Sta abbinando perché trova "una corrispondenza" non una corrispondenza dell'intera stringa. Puoi risolvere questo problema cambiando il tuo regexp per cercare in modo specifico l'inizio e la fine della stringa.

^\d+$

16

Forse il mio metodo ti aiuterà.

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

3
Tieni presente, tuttavia, che Char.IsDigitrestituisce trueper qualsiasi carattere membro della categoria UnicodeCategory.DecimalDigitNumber . Questo potrebbe non essere quello che vuole l'OP. Vedi anche Perché Char.IsDigit restituisce true per i caratteri che non possono essere analizzati in int? .
DavidRR


16

Funziona con numeri interi e decimali. Non corrisponde se il numero ha il separatore delle migliaia di coma,

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

alcune stringhe che corrispondono a questo:

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

alcune stringhe che non:

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

11

^ \ d + $, che è "inizio della stringa", "1 o più cifre", "fine della stringa" in inglese.


10

Se devi controllare se tutte le cifre sono numerate (0-9) o meno,

^[0-9]+$

1425 VERO

0142 TRUE

0 VERO

1 VERO

154a25 FALSO

1234 = 3254 FALSO


10

Ecco il mio lavoro:

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

E alcuni test

Test positivi:

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

Test negativi:

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

Controllato non solo per C #, ma anche con Java, Javascript e PHP


" 0,3" , "3". sono in realtà buoni numeri (rispettivamente 0,3 e 3,0). lo vediamo continuamente nei sistemi di origine e la maggior parte delle funzioni to_number (xx) delle lingue che hai citato le riconosceranno e le convertiranno correttamente. Grazie.
Tagar,

1
@Ruslan hai ragione nel dire che in molti sistemi ".3", "3". analizzerebbe un numero valido e verrà utilizzato come indicato "0,3" e "3,0". D'altra parte, questo è il valore convertito , quindi il valore originale ".3" e "3." non è un numero realmente esistente.
Marina K.

9

Ci scusiamo per la brutta formattazione. Per qualsiasi numero di cifre:

[0-9]*

Per una o più cifre:

[0-9]+

7

Sebbene nessuna delle soluzioni sopra indicate fosse adatta al mio scopo, questo ha funzionato per me.

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

Esempio di valori validi: "3", "-3", "0", "0.0", "1.0", "0.7", "690.7", "0.0001", "-555", "945465464654"

Esempio di valori non validi: "a", "", "", ".", "-", "001", "00.2", "000.5", ".3", "3.", "-1" , "--1", "-.1", "-0", "00099", "099"


4

Un altro modo: se ti piace abbinare numeri internazionali come persiano o arabo, puoi usare la seguente espressione:

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

Per abbinare il carattere letterale del periodo usare:

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

4

usa le ancore di inizio e fine.

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

3

Regex per numeri interi e in virgola mobile:

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

Un numero può iniziare con un punto (senza cifre iniziali) e un numero può terminare con un punto (senza cifre finali). Sopra regex riconoscerà entrambi come numeri corretti.

A. (punto) stesso senza cifre non è un numero corretto. Ecco perché abbiamo bisogno di due parti regex lì (separate da un "|").

Spero che questo ti aiuti.


1
Questa è la soluzione più completa. Congratulazioni!
Renato Medeiros,

2

Penso che questo sia il più semplice e accetta il modo di scrivere numeri europei e statunitensi, ad es. USA 10.555,12 europeo 10,555,12 Anche questo non consente più virgole o punti uno dopo l'altro, ad esempio 10..22 o 10, .22 Oltre a questi numeri come .55 o, 55 passerebbero. Questo può essere utile.

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


-4

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


5
Puoi spiegare un po 'la tua risposta per favore? Noterai che le altre risposte a questa domanda hanno un certo livello di spiegazione di ciò che fa ogni parte della regex, che ti manca.
Wai Ha Lee,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.