2011-07-11 13 views
5

nie jestem bardzo nowy z wyrażeń regularnych, ale nie byłem w stanie znaleźć odpowiedniego wyrazu dla mojego problemu do tej pory:JavaScript-Regular Expressions

Chcę sprawdzić, czy ciąg znaków, który użytkownik wpisze język pole tekstowe. Ciąg musi składać się z jednego lub więcej terminów oddzielonych średnikiem.

istnieją dwa rodzaje warunków:

  1. Pierwszy składa się z kilku, po czym następuje myślnik i następnie przez numer kolejny przykład 1-4 lub 22-44

  2. Drugi termin składa się z liczby i przecinka powtórzonego zero lub więcej razy, np. 1,2 lub 4,5,6

Wszystkie warunki muszą być zawierane średnikiem.

Ważny wejście byłoby: 1-4;5,6,7;9-11; lub 1,3;4-6;8,9,10;

Próbowałem tak wiele odmian, ale nie mógł znaleźć rozwiązanie do tej pory. Mój problem polega na tym, że ten ciąg wejściowy może składać się z dowolnej liczby terminów. Próbowałem rozwiązać ten problem z operatorem OR i "z wyprzedzeniem", ale bez powodzenia.

Każda pomoc będzie bardzo ceniona.

Dzięki dużo, enne

+4

Twoje przykłady nie pasują do Twojego opisu. W pierwszym "prawidłowym wprowadzeniu" brakuje końcowego średnika, a "22-44" nie jest "cyfrą poprzedzającą myślnikiem ...". –

+0

To prawda, Kerrek, dodał średnik i zmienił "cyfrę" na "numer". Dzięki za uwagę. – enne87

Odpowiedz

4

Ten regex powinna zrobić to, czego potrzebujesz:

/^(?:[0-9]+-[0-9]+;|[0-9]+(?:,[0-9]+)*;)+$/ 
+0

To nie przyjmie "1-4; 5,6,7, 9-11", jego przykład bez terminala ';'. – Vache

+0

@Vache - zauważając, że wymóg PO jest niejednoznaczny, biorąc pod uwagę, że ten przykład nie zgadza się z oświadczeniem na linii przed nim, że "Wszystkie warunki muszą być zakończone średnikiem." – nnnnnn

+0

Dobra uwaga. W opisie powiedziano, że ** "wszystkie terminy muszą być zakończone średnikiem" **, więc założyłem, że dotyczy to również ostatniego terminu. – EdoDodo

2

edycja: Pierwsze pytanie wyglądały średniki są separatory, teraz pokazuje je jako terminatory.

Tutaj sekwencja z jednego lub większej liczby warunków, zakończone średnikami, przy czym każdy składnik jest albo numer lub zakres liczbowy lub lista numerów oddzielonych przecinkami:

/^(\d+(-\d+|(,\d+)*)?;)+$/ 

Z nie grupy -capturing

/^(?:\d+(?:-\d+|(?:,\d+)*)?;)+$/ 
+0

Bardzo fajny Ray, dzięki :) Niestety, mogę ustawić tylko jedną odpowiedź jako zaakceptowaną odpowiedź:/ – enne87

1

moje zdanie ..

^(?:\d+-\d+(?:;|$)|(?:\d+(?:[,;]|$))+)+$

+0

Nieźle, brakuje tylko ostatniego średnika ostatniego terminu. Dzięki za pomoc. – enne87

Powiązane problemy