2009-08-31 9 views
5

Próbuję sprawdzić dane wejściowe użytkownika, które są po prostu oddzielone przecinkiem numery. Chciałbym to zrobić z RegEx, ale nie mogę wymyślić właściwego wyrażenia.Regex dla Comma Separated Number

Należy zweryfikować następujące ciągi (i większe):

1 
12 
123 
1,234 
12,345 
123,456 

i unieważnić następujące ciągi (i szalony):

1,1 
1,12 
12,1 
12,12 
123,1 
123,1 

Każda pomoc będzie mile widziana.

Oto co próbowałem tej pory (EDIT: które nie działają), wraz z kilkoma wariantami ->

^(((\d{1,3},)*\d{3})|(\d{1,3}))$ 
^(\d{1,3}[,])*\d{3}|\d{1,3}$ 

Odpowiedz

14

Jak o tym:

^\d{1,3}([,]\d{3})*$ 

Zasadniczo można mieć 1-3 cyfry bez przecinków. Potem potrzebujesz przecinka. Jeśli masz przecinek, musisz musi być śledzone przez 3 kolejne cyfry. Ta sekwencja z trzema cyframi może pojawić się dowolną liczbę razy.

EDIT: Jak zauważył Andrzej Zając, nie dbam o to, co zostało znalezione wewnątrz nawiasów poza tym, że dopasowane, dzięki czemu można używać non-przechwytywania grupę zamiast umieszczając ?: po nawiasie otwierającym:

^\d{1,3}(?:[,]\d{3})*$ 
+3

+1 Ładnie wykonane. Moja jedyna krytyka: ponieważ to wyrażenie regularne służy wyłącznie do sprawdzania poprawności, powinieneś zmienić tę grupę przechwytywania, aby była grupą niezarejestrowaną. –

+2

Dobra uwaga, ale zawsze mi przeszkadzało, że zrobienie grupy non-capture sprawia, że ​​regex jest bardziej brzydki. –

+0

patrząc na oryginalne wyrażenie regularne wygląda na oświetlony ciąg jak 12,1,123 jest legalny ((\ d {1,3},) * \ d {3}), co powyższe nie spełnia –