2011-10-07 22 views
35

Ho una regexRegex per alfanumerico con almeno 1 numero e 1 carattere

/^([a-zA-Z0-9]+)$/

questo permette solo solo caratteri alfanumerici, ma anche se inserisco solo numero (s) o solo carattere (s) quindi lo accetta anche. Voglio che funzioni come se il campo dovesse accettare solo valori alfanumerici, ma il valore deve contenere almeno 1 carattere e 1 numero.

risposta

62

Perché non applicare prima l'intero test e quindi aggiungere singoli test per caratteri e numeri? In ogni caso, se si vuole fare tutto in un'espressione regolare, utilizzare lookahead positivo:

/^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$/ 
+2

Questa soluzione è migliore della soluzione seguente: se si desidera aggiungere un trattino e un trattino di sottolineatura, tutto funzionerà ancora. Es: '^ (? =. * [0-9]) (? =. * [Az]) ([a-z0-9 _-] +) $' abc-d12345 – Sababado

+1

grazie mille sia per la risposta che per la spiegazione di modo di pensare – merveotesi

+0

@Sababado grazie per _ - soluzione :-) – Rahi

16

Questo RE farà:

/^(?:[0-9]+[a-z]|[a-z]+[0-9])[a-z0-9]*$/i 

Spiegazione di RE:

  • Partita una delle seguenti operazioni:
    1. Almeno un numero, quindi una lettera o
    2. Almeno una lettera, quindi un numero più
  • Eventuali altri numeri e lettere

  • (?:...) crea un gruppo referenziata
  • /i è il ignorare caso bandiera , cosicché a-z == a-zA-Z.
+0

Perché abbiamo bisogno di maiuscole e minuscole in questo? –

+0

Il/i alla fine lo rende senza distinzione tra maiuscole e minuscole. – Kasaku

+0

Nel tuo codice hai menzionato 'a-zA-Z'. Ho fatto alcuni test ieri, e ho dedotto che '/ [a-z]/i' è leggermente più veloce di'/[a-zA-Z]/'. Vedi: http://jsperf.com/regexp-a-z-i-vs-a-za-z –

13

Vedo che altri soccorritori si hanno dato una soluzione completa. Il problema con le espressioni regolari è che possono essere difficili da mantenere/capire.

Una soluzione più semplice sarebbe quella di mantenere la regex esistente, quindi creare due nuove espressioni regolari da verificare per "almeno un alfabetico" e "almeno un valore numerico".

Così, test per questo: -

/^([a-zA-Z0-9]+)$/ 

Allora questo: -

/\d/ 

Allora questo: -

/[A-Z]/i 

Se la stringa passa tutte e tre le espressioni regolari, avete la risposta che ti serve

+0

Mi piace molto la semplicità di questo. Molto, molto più facile da leggere e mantenere. –

2

Forse un po 'tardi, ma questo è il mio RE:

/^(\w*(\d+[a-zA-Z]|[a-zA-Z]+\d)\w*)+$/

Spiegazione:

\w* -> 0 o più caratteri alfanumerici, all'inizio

\d+[a-zA-Z]|[a-zA-Z]+\d -> un cifra + una lettera O una lettera + una cifra

\w* -> 0 o più caratteri alfanumerici, di nuovo

spero era comprensibile

3

Questa soluzione accetta almeno 1 numero, e almeno 1 carattere:

[^\w\d]*(([0-9]+.*[A-Za-z]+.*)|[A-Za-z]+.*([0-9]+.*)) 
3

Mentre la risposta accettata è corretta, ho trovato questo regex molto più facile da leggere:

REGEX = "([A-Za-z]+[0-9]|[0-9]+[A-Za-z])[A-Za-z0-9]*" 
Problemi correlati