2015-12-07 15 views
7

Potrzebuję wyrażeń regularnych pasujących do ciągu znaków, gdy użytkownik go wpisuje. Jest to trochę trudne do wytłumaczenia, więc pozwól mi pokazać, co mam na myśli:Jak utworzyć "ponownie pasujące" wyrażenie regularne?

Należy dopasować ten ciąg:

"XXXX units", gdzie XXXX oznacza dowolną liczbę.

Ale należy również dopasować dowolny fragment od początku tego łańcucha, tak:

"123" 
"123 u" 
"123 uni" 

powinien również pasować.

Ale oczywiście, to nie powinien pasować:

"123 xx" 

To wydaje się takie proste, ale nie mogę zupełnie zrozumieć. To jest najbliższe:

^\d+ ?u?n?i?t?s? 

... ale niestety pasuje również do ciągów takich jak "123us".

Czy ktoś może pomóc? To javascript, więc może być nieco ograniczona przez brak wygląd tyłu/do przodu wyposażony ...

+0

@CodeiSir - to także pasuje do rzeczy takich jak "123 nas", co nie powinno ... :) – Zissou

+0

^\ d + (u (n (i (t (s)?)?)?) ?)? $ – CoderPi

+0

Zobacz http://stackoverflow.com/questions/33213891/regex-for-dates-that-matches-for-every-stage-of-valid-date-entry/33215086#33215086. –

Odpowiedz

8

Wystarczy dodać kilka ():

/^\d+((u(n(i(t(s)?)?)?)?)?)?$/ 

Testowanie:

/^\d+((u(n(i(t(s)?)?)?)?)?)?$/.test("123 units") -> true 
/^\d+((u(n(i(t(s)?)?)?)?)?)?$/.test("123 un")  -> true 
/^\d+((u(n(i(t(s)?)?)?)?)?)?$/.test("123 ui")  -> false 
/^\d+((u(n(i(t(s)?)?)?)?)?)?$/.test("12")   -> true 
/^\d+((u(n(i(t(s)?)?)?)?)?)?$/.test("123 xx")  -> false 
+0

Dziękujemy! Wygląda przezabawnie, ale to działa. :) – Zissou

+1

Tak, robi to, czy nie ;-) Można również podzielić na przestrzeni, dopasować pierwszą część z '\ d +' i ostatnią część z '" units ".indexOf (...) == 0' . – Kenney

1

to nie wygląda świetnie, ale dostaje zadanie ...

^(\d+((u(n(i(t(s)?)?)?)?)?)?)?$ 
+0

Brakuje '$' na końcu - będzie również pasować do '123 xx'. – Kenney

+0

I zamknięcie) – CoderPi

+0

Wszystko gotowe, dziękuję! – Thomas

Powiązane problemy