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.