2015-12-07 13 views
7

Ho bisogno di un'espressione regolare che corrisponde a una stringa mentre l'utente la digita. E 'un po' difficile da spiegare, quindi mi permetta di mostrare quello che voglio dire:Come posso creare un regex "progressivamente corrispondente"?

Deve corrispondere questa stringa:

"XXXX units", dove XXXX è un numero qualsiasi.

ma dovrebbe anche corrispondere a qualsiasi stringa dall'inizio della stringa, quindi:

"123" 
"123 u" 
"123 uni" 

deve anche corrispondere.

Ma, naturalmente, questo non dovrebbe corrispondere:

"123 xx" 

Sembra così semplice, ma non riesco a capirlo. Questo è il più vicino che ho:

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

... ma sfortunatamente corrisponde anche a stringhe come "123us".

Qualcuno può aiutare? E 'javascript, così che io possa essere un po' limitata dalla mancanza sguardo dietro/caratteristiche avanti ...

+0

@CodeiSir -??? Che corrisponde anche cose come "123 noi", che non dovrebbe ... :) – Zissou

+0

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

+0

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

risposta

8

Basta aggiungere un po ' ():

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

Testing:

/^\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

Grazie! Sembra esilarante, ma fa il trucco. :) – Zissou

+1

Sì, lo fa ,-); Puoi anche dividere lo spazio, abbinare la prima parte con '\ d +' e l'ultima parte con '" unità ".indexOf (...) == 0' . – Kenney

1

Non sembra grande, ma ottiene il lavoro fatto ...

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

Ti manca il '$' alla fine - corrisponderà anche a '123 xx'. – Kenney

+0

E una chiusura) – CoderPi

+0

Tutto fatto, grazie! – Thomas

Problemi correlati