2011-12-21 19 views
30

Jestem trochę nowy w wyrażeniach regularnych i piszę sprawdzanie poprawności dla pola ilości, w którym używane są wyrażenia regularne .RegEx: Jak mogę dopasować wszystkie liczby większe niż 49?

Jak mogę dopasować wszystkie liczby większe lub równe 50?

Próbowałem

 
[5-9][0-9]+ 

ale to tylko mecze 50-99. Czy istnieje prosty sposób na dopasowanie wszystkich możliwych liczb większych niż 49? (Tylko liczby całkowite są używane)

+1

Czy jest jakiś powód, dla którego nie używasz wyrażenia regularnego, aby wyodrębnić część liczbową, a następnie przekonwertować ją i przetestować jako liczbę? Wydaje się, że byłoby to o wiele prostsze. –

+0

Należy użyć wyrażenia regularnego, aby zachować zgodność z naszym systemem. Jest zbyt długi i zawiłowany na historię tego bloku komentarzy. Nie trzeba dodawać, że gdyby był inny sposób, użyłbym go. Używa się tylko liczb całkowitych @ridgerunner. – Maxx

Odpowiedz

59

Fakt, że pierwsza cyfra musi być w zakresie 5-9 zastosowanie jedynie w przypadku dwóch cyfr. Więc sprawdzić, że w przypadku 2 cyfr i pozwalają żadnych więcej cyfr wprost:

^([5-9]\d|\d{3,})$ 

ten regexp jest rozpoczynający/kończący kotwy do upewnij się, że sprawdzenie wszystkich cyfr, a łańcuch właściwie oznacza numer . | oznacza "lub", więc albo [5-9]\d lub dowolną liczbę z 3 lub więcej cyfr. \d to po prostu skrót do [0-9].

Edit: Aby uniemożliwić numery jak 001:

^([5-9]\d|[1-9]\d{2,})$ 

Zmusza pierwszą cyfrę, aby nie być zerowy w przypadku 3 lub więcej cyfr.

+0

Wow, to jest idealne! Dziękuję bardzo. – Maxx

+1

Dziękuję również za wyjaśnienie. Czuję, że naprawdę czegoś się nauczyłem. +1 – Maxx

+0

@pimvdb: Twoje użycie '^' i '$' oznaczałoby, że cały ciąg jest liczbowy. Nasuwa się pytanie, dlaczego potrzebne jest wyrażenie regularne? –

1

Spróbuj regex:

[5-9]\d+|\d{3,} 
+0

To jest blisko, ale liczby takie jak "444" nie pasują. – Maxx

+0

Zaktualizowana wersja wydaje się działać! – Maxx

4

Spróbuj grupę warunkowego pasujące 50-99 lub dowolny ciąg trzech lub więcej cyfr:

var r = /^(?:[5-9]\d|\d{3,})$/ 
17

wiem, że jest już dobra odpowiedź wysłana, ale nie pozwoli zera. I nie ma wystarczającej reputacji zostawić komentarz, więc ... Oto moje rozwiązanie pozwala zer:

Najpierw odpowiadają numerom 50 do 99 (z możliwymi wiodących zer):

0*[5-9]\d 

Następnie dopasować numery 100 i powyżej (również z zerami na początku):

0*[1-9]\d{2,} 

Dodaj je razem z „lub” i owinąć go dopasować całe zdanie:

^0*([1-9]\d{2,}|[5-9]\d)$ 

To wszystko!

1

Next matches wszystkie większe lub równe 11100:

^([1-9][1-9][1-9]\d{2}\d*|[1-9][2-9]\d{3}\d*|[2-9]\d{4}\d*|\d{6}\d*)$ 

For greater or equal50:

^([5-9]\d{1}\d*|\d{3}\d*)$ 

Patrz wzór i modyfikować do dowolnej liczby. Również byłoby świetnie znaleźć rekursywne operatory forward/backward dla dużych liczb.

Powiązane problemy