Regex tylko dla liczb


309

W ogóle nie używałem wyrażeń regularnych, więc mam problemy z rozwiązywaniem problemów. Chcę, aby wyrażenie regularne pasowało tylko wtedy, gdy zawarty ciąg zawiera wszystkie liczby; ale w dwóch poniższych przykładach dopasowuje ciąg zawierający wszystkie liczby plus znak równości, taki jak „1234 = 4321”. Jestem pewien, że istnieje sposób na zmianę tego zachowania, ale jak powiedziałem, nigdy tak naprawdę niewiele zrobiłem z wyrażeniami regularnymi.

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

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

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

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

W razie potrzeby używam C # i .NET2.0.


6
Czy potrzebujesz dopasować liczby lub cyfry ? Na przykład: 123.456 to liczba, ale nie wszystkie cyfry.
Joel Coehoorn,

Dokładnie, OP nie jest całkowicie jasne o używaniu liczb całkowitych, czy nie
Sune Rievers

3
Dlaczego nie wypróbować ciągu dla tego prostego przypadku? bool decimal.TryParse (ciąg znaków, wynik dziesiętny) lub bool int.TryParse (ciąg znaków, wynik int)
Makach,

Spójrz na tę odpowiedź, aby ostatecznie potraktować parsowanie liczb wyrażeniami regularnymi.
tchrist

1
Ogólnie moim zdaniem najłatwiejszym sposobem rozwiązywania problemów z wyrażeniami Regex jest użycie interpretera wiersza poleceń, jeśli Twój język na to pozwala (wydaje się, że większość). Ponieważ ten przykład jest w C #, możesz użyć linqpad.net lub możesz użyć punktu przerwania w debuggerze, a następnie użyć okna Natychmiastowego w VS jako CLI.
andrew

Odpowiedzi:


478

Użyj początkowej i końcowej kotwicy.

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

Użyj, "^\d+$"jeśli chcesz dopasować więcej niż jedną cyfrę.


Pamiętaj, że "\d"będą pasować [0-9]i inne cyfry, takie jak cyfry wschodniego języka arabskiego ٠١٢٣٤٥٦٧٨٩. Użyj, "^[0-9]+$"aby ograniczyć dopasowania tylko do cyfr arabskich 0–9.


Jeśli trzeba zawierać żadnych oświadczeń numerycznych inne niż tylko cyfr (takich jak wartości dziesiętnych dla początkujących), a następnie zobaczyć @tchrist „s obszerny przewodnik do analizowania liczb z wyrażeń regularnych .


Co powiesz na określoną liczbę wartości liczbowych? Zwykle dzieje się tak w przypadku kodów pocztowych niektórych krajów, takich jak Indie. Myślę, że po tym może być konieczne sprawdzenie długości łańcucha?
Najeeb,

2
@Najeeb Tak, ponieważ indyjskie kody pocztowe to cyfry 6-cyfrowe, możesz użyć czegoś takiego "^\d{6}$". W niektórych innych krajach obowiązują bardziej skomplikowane reguły dotyczące kodów pocztowych, więc rozwiązania wyrażeń regularnych dla wielu krajów również mogą się skomplikować. Sprawdź niektóre przykłady na stackoverflow.com/q/578406/1288
Bill the Lizard

Jak to się dzieje, że ciąg wejściowy jest taki: „3 a” nadal będzie pasował? Czy ktoś wie, jak mogę go dopasować TYLKO, jeśli istnieją liczby i nic więcej (chyba, że ​​znak ujemny). Obecnie mam skonfigurowane w ten sposób „-? [0-9] +”.
Matthew

105

Twoje wyrażenie regularne pasuje do wszystkiego, co zawiera liczbę, chcesz użyć kotwic, aby dopasować cały ciąg, a następnie dopasować jedną lub więcej liczb:

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

^Będzie zakotwiczyć początku napis, to $będzie zakotwiczyć koniec łańcucha i +będzie pasował do jednego lub więcej z tego, co go poprzedza (numer w tym przypadku).


38

Jeśli chcesz tolerować przecinek dziesiętny i tysiąc znaczników

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

Będziesz potrzebował „-”, jeśli liczba może być ujemna.


@Florin Ghita. Dzięki. „-” musi być na początku.
Andy

3
Wyrażenie regularne również błędnie pozwala na wystąpienie wiodącego znaku ujemnego ( -) i kropki ( .) więcej niż jeden raz.
DavidRR

5
możesz zrobić -i .opcjonalnie za pośrednictwem ?. -?\d+(?:\.\d+)?będą pasować do liczb całkowitych lub dziesiętnych. ( ?:Parens po prostu sprawia, że
pareny stają się

2
Nie udaje się to w przypadkach krawędziowych, takich jak 1, 5, ale jeśli to nadzorujesz. nadal zawodzi w podstawowych przypadkach, takich jak -2. Zmień to, aby ^-?[0-9][0-9,\.]*$uniknąć niepowodzenia w przypadku podstawowym. + zastępuje się *
PrivateOmega

Jednym ze scenariuszy, którego mi brakuje, jest notacja inżynierska (1.2345e-4), jakieś sugestie na ten temat?
WolfiG

18

Pasuje, ponieważ znajduje „dopasowanie”, a nie dopasowanie pełnego łańcucha. Możesz to naprawić, zmieniając wyrażenie regularne tak, aby konkretnie szukało początku i końca łańcucha.

^\d+$


16

Działa to z liczbami całkowitymi i dziesiętnymi. Nie pasuje, jeśli liczba ma separator tysięcy śpiączki,

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

niektóre ciągi pasujące do tego:

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

niektóre ciągi, które nie:

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

11

^ \ d + $, czyli „początek ciągu”, „1 lub więcej cyfr”, „koniec ciągu” w języku angielskim.


10

Jeśli chcesz sprawdzić, czy wszystkie cyfry są cyframi (0–9), czy nie,

^[0-9]+$

1425 PRAWDA

0142 PRAWDA

0 PRAWDA

1 PRAWDA

154a25 FAŁSZ

1234 = 3254 FAŁSZ


10

Oto mój działający:

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

I kilka testów

Pozytywne testy:

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

Testy negatywne:

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

Sprawdzone nie tylko w języku C #, ale także w Javie, JavaScript i PHP


„.3”, „3”. to właściwie dobre liczby (odpowiednio 0,3 i 3,0). cały czas widzimy to w systemach źródłowych i większość funkcji to_number (xx) języków, o których wspomniałeś, rozpozna je i poprawnie skonwertuje. dzięki.
Tagar

1
@ Ruslan masz rację, że w wielu systemach „.3”, „3”. przeanalizuje prawidłowy numer i użyje go, jak wspomniałeś „0.3” i „3.0”. Ale z drugiej strony - jest to wartość przeliczona , więc wartość oryginalna „.3” i „3.” tak naprawdę nie istnieje numer.
Marina K.

9

Przepraszamy za brzydkie formatowanie. Dla dowolnej liczby cyfr:

[0-9]*

Dla jednej lub więcej cyfr:

[0-9]+

7

Chociaż żadne z powyższych rozwiązań nie pasowało do mojego celu, działało to dla mnie.

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

Przykład prawidłowych wartości: „3”, „-3”, „0”, „0,0”, „1,0”, „0,7”, „690,7”, „0,0001”, „-555”, „945465464654”

Przykład niepoprawnych wartości: „a”, „”, „”, „.”, „-”, „001”, „00.2”, „000.5”, „.3”, „3.”, „-1” , „--1”, „-.1”, „-0”, „00099”, „099”


4

Inny sposób: jeśli chcesz dopasować numery międzynarodowe, takie jak perski lub arabski, możesz użyć następującego wyrażenia:

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

Aby dopasować znak literału, użyj:

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

4

użyj początkowej i końcowej kotwicy.

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

3

Regex dla liczb całkowitych i zmiennoprzecinkowych:

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

Liczba może zaczynać się od kropki (bez wiodących cyfr), a liczba może kończyć się kropką (bez końcowych cyfr). Powyżej wyrażenia regularnego rozpoznają oba jako poprawne liczby.

A (kropka) sam bez cyfr nie jest poprawną liczbą. Dlatego potrzebujemy tam dwóch części wyrażenia regularnego (oddzielonych znakiem „|”).

Mam nadzieję że to pomoże.


1
To jest najbardziej kompletne rozwiązanie. Gratulacje!
Renato Medeiros

2

Myślę, że ten jest najprostszy i akceptuje europejski i amerykański sposób pisania liczb, np. USA 10 555,12 europejski 10,555,12 Również ten nie dopuszcza kilku przecinków ani kropek jeden po drugim, np. 10..22 lub 10, .22 Oprócz tych liczb, takich jak .55 lub, 55 przejdzie. To może się przydać.

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


-4

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


5
Czy możesz wyjaśnić nieco swoją odpowiedź? Zauważysz, że inne odpowiedzi na to pytanie zawierają pewne wyjaśnienie tego, co robi każda część wyrażenia regularnego, czego ci brakuje.
Wai Ha Lee
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.