2010-11-03 12 views
29

Qualcuno mi può fornire un'espressione regolare per lo SSN che corrisponde siaSSN Regex per 123-45-6789 O XXX-XX-XXXX

123-45-6789

O

XXX-XX- XXXX

Attualmente ho ^\d{3}-?\d{2}-?\d{4}$ che corrisponde alla prima espressione, ma è necessario aggiungere la seconda espressione come alternativa.

Grazie!

+0

soluzione con test di unità https://regex101.com/r/rP8wL0/1 –

risposta

30

(^\d{3}-?\d{2}-?\d{4}$|^XXX-XX-XXXX$) dovrebbe farlo.

---- ---- EDIT

Come Joel sottolinea che si potrebbe anche fare ^(\d{3}-?\d{2}-?\d{4}|XXX-XX-XXXX)$ che è un po 'più ordinato.

+4

avrei estratto la^$ parte, ma questo dovrebbe funzionare. –

+0

Ho pensato che sarebbe stato qualcosa di banale, non sono così familiare con le regole regex. Grazie! –

+0

@Chris Conway: Non posso raccomandare abbastanza il libro O'Reilly Mastering Regular Expressions di Jeffrey E F Friedl, anche lo strumento regex Expresso (http://www.ultrapico.com/Expresso.htm) è fantastico. – Lazarus

1

allora può essere

/^[\dX]{3}-?[\dX]{2}-?[\dX]{4}$/ 

se si vuole x per essere valido anche, è possibile aggiungere il modificatore i fino alla fine:

/^[\dX]{3}-?[\dX]{2}-?[\dX]{4}$/i 

A pensarci bene, l'espressione regolare sopra accetterà

123-xx-xxxx 

, quindi a seconda se si desidera questo modulo t o essere accettata o meno, è possibile usare la vostra forma originale "o" l'altra forma:

/^(\d{3}-?\d{2}-?\d{4})|(xxx-xx-xxxx)$/i 
+1

hai una stringa 1X3-XXX-4451 valida – Andrew

+0

Ad esempio 12XX0-123X corrisponderà anche. Probabilmente non quello che era destinato. –

+0

oh ah, stavamo inserendo il testo allo stesso tempo –

0

^\d{3}-?\d{2}-?\d{4}$|^XXX-XX-XXXX$

4

Così si hanno attualmente: ^\d{3}-?\d{2}-?\d{4}$

Quello che vi serve è quello di consentire una delle quei blocchi numerici devono essere "X" invece. Questo è anche abbastanza semplice come una regex - basta adattare il vostro uno esistente per avere X invece di \d in ognuno dei tre luoghi essa è presente X{3}-?X{2}-?X{4}

Lei non vuole essere la combinazione di un codice numerico con il codice e X, quindi basta per consentire sia un caso o nell'altro, quindi avvolgerli tra parentesi e ci ha un carattere pipe di specificare uno o l'altro, in questo modo:

^((\d{3}-?\d{2}-?\d{4})|(X{3}-?X{2}-?X{4}))$ 

probabilmente anche desidera consentire superiore - o minuscolo X. Questo può essere specificato usando [Xx] o rendendo l'intero caso non sensibile, usando il modificatore i all'esterno della regex.

40

Per rigorosamente rispondergli domanda:

^(123-45-6789|XXX-XX-XXXX)$ 

shoud lavoro. ;-)

Se leggi la sezione "Valid SSNs" sull'articolo SSN di Wikipedia, diventa chiaro che un'espressione regolare per la convalida SSN è un po 'più complicata.

conseguenza un po ' più accurato puro SSN regex sarebbe simile a questa:

^(?!(000|666|9))\d{3}-(?!00)\d{2}-(?!0000)\d{4}$ 
+0

+1 per il collegamento. – jensgram

+0

grazie mille utile –

+1

Mentre scrivo questo commento, questa risposta è stata modificata l'ultima volta il 3 novembre 2010. Tuttavia, l'articolo di riferimento di Wikipedia afferma che la convalida SSN è stata modificata il 25 giugno 2011, consentendo più numeri in più posizioni. – Chris

1

Una partita più generico sarebbe:

(^[^-]{3}-?[^-]{3}-?[^-]{4}$) 

Ciò adattarsi a qualsiasi sequenza di caratteri diversi "-" nella configurazione dei caratteri 3-3-4. Per esempio:

my @str = qw/ 
    1adfasdfa 
    adsfaouaosd90890 
    111-232-adafd 
    xXX-232-1234 
    111-222-4444 
    $$%-AF#[email protected] 
/; 

foreach(@str) 
{ 
    print "$_\n" if /^[^-]{3}-?[^-]{3}-?[^-]{4}$/; 
}