2012-11-25 10 views
5

Czy istnieje regex (!), Który może sprawdzić, czy ciąg zawiera 3 cyfry (nie pamiętając o kolejności)?Regex na 3 cyfry (nie pamiętasz kolejności)?

(przynajmniej 3 cyfry też będę szczęśliwy, aby zobaczyć dokładnie 3 (jeśli jesteś kind).).

Przykład:

abk2d5k6 //3 digits 
abk25k6d //same here //3 digits 

moich nie stara:

.+?(?=\d){3} 

Dzięki.

(do celów edukacyjnych proszę używać wyłącznie rozwiązań regex.).

+2

Jest. Co próbujesz? –

+1

Co najwyżej trzy, co najmniej trzy lub dokładnie trzy? –

+0

@JanDvorak Ive wiele próbowałem. (uwierz mi). Próbowałem z pozytywnym spojrzeniem, ale utknąłem z '\ d +' (rzeczą 'plus' - ponieważ plus chce, aby był sekwencyjny). na drugie pytanie, powiedzmy co najmniej 3. (przepraszam, że nie wyjaśniam tego). –

Odpowiedz

11

Cóż, w celach edukacyjnych proponuję przeczytać ten bardzo obszerny numer tutorial.

przeciwnym razie regex JavaScript prawdopodobnie wyglądać następująco:

jeśli chcesz, aby upewnić się, że istnieją co najmniej trzy cyfry:

/^(?:\D*\d){3}/ 

Lub jeśli chcesz, aby upewnić się, że nie są dokładnie trzy cyfry:

/^(?:\D*\d){3}\D*$/ 

\D to każda niezgodność-cyfrowy charakter. * zezwala na 0 lub więcej z nich. \d to dowolna cyfra. {3} powtarza podtekst 3 razy. I ^ i $ oznaczają odpowiednio początek i koniec ciągu znaków.

+0

Nie trzeba używać przechwytywania ;-) –

+6

@JanDvorak nigdy nie ma potrzeby używania przechwytywania. To zawsze tylko optymalizacja. Sądzę, że lepszą praktyką jest używanie przechwytywania tylko wtedy, gdy jest taka potrzeba, zamiast na odwrót. –

+1

Zabawne wciąż nazywamy je "zwykłymi" wyrażeniami, prawda? – Kos

3

Można też zrobić coś takiego:

str.match(/\d/g).length >= 3 

To jest martwe proste i bardzo wyraźnie wskazuje na intencje bez skomplikowanego wyrażenia regularnego.

To nie jest dostrojone do prędkości.

+1

Mimo że pytanie mówi, że pyta specjalnie o regex dla celów edukacyjnych, bardzo podoba mi się prostota tego. +1! –

+0

Wciąż używa wyrażeń regularnych, ale tylko technicznie. Dostarczyłem go tylko do alternatywnego użycia regex, aby rozwiązać ten sam problem. – tjameson

2

Biorąc swój komentarz, który chcesz „co najmniej” trzy cyfry, nie sądzę, że musi być bardziej skomplikowane niż:

/\d.*\d.*\d/ 

... co jest cyfrą, to zero lub więcej cokolwiek, potem kolejna cyfra, potem zero lub więcej cokolwiek, potem kolejna cyfra. Ponieważ nie zakotwiczyłem żadnego końca, istnieje niejawne "zero lub więcej niczego" na obu końcach.

console.log(!!"abk2d5k6".match(/\d.*\d.*\d/)); // true 
console.log(!!"abk25k6d".match(/\d.*\d.*\d/)); // true 
console.log(!!"abkd5k6".match(/\d.*\d.*\d/)); // false (I removed a digit) 
console.log(!!"abk2k6d".match(/\d.*\d.*\d/)); // false (I removed a digit) 

lub

/(\d.*){3}/ 

console.log(!!"abk2d5k6".match(/(\d.*){3}/)); // true 
console.log(!!"abk25k6d".match(/(\d.*){3}/)); // true 
console.log(!!"abkd5k6".match(/(\d.*){3}/)); // false (I removed a digit) 
console.log(!!"abk2k6d".match(/(\d.*){3}/)); // false (I removed a digit) 

lub m.Buettner zwraca uwagę w komentarzach poniżej, zamiast . można użyć \D (nie cyfrę):

/\d\D*\d\D*\d/ 

lub

/(\d\D*){3}/ 

display(!!"abk2d5k6".match(/\d\D*\d\D*\d/)); // true 
display(!!"abk25k6d".match(/\d\D*\d\D*\d/)); // true 
display(!!"abkd5k6".match(/\d\D*\d\D*\d/)); // false (I removed a digit) 
display(!!"abk2k6d".match(/\d\D*\d\D*\d/)); // false (I removed a digit) 

display(!!"abk2d5k6".match(/(\d\D*){3}/)); // true 
display(!!"abk25k6d".match(/(\d\D*){3}/)); // true 
display(!!"abkd5k6".match(/(\d\D*){3}/)); // false (I removed a digit) 
display(!!"abk2k6d".match(/(\d\D*){3}/)); // false (I removed a digit) 

Zasadniczo, nie ma potrzeby kotew jeśli jest to „co najmniej” mecz .

Powiązane problemy