2010-11-03 2 views
29

Kann mir jemand bieten einen regulären Ausdruck für SSN, die Spiele entwederSSN Regex für 123-45-6789 oder XXX-XX-XXXX

123-45-6789

ODER

XXX-XX- XXXX

Ich habe derzeit ^\d{3}-?\d{2}-?\d{4}$, die den ersten Ausdruck entspricht, aber ich muss den zweiten Ausdruck als Alternative hinzufügen.

Danke!

+0

Lösung mit Unit-Tests https://regex101.com/r/rP8wL0/1 –

Antwort

30

(^\d{3}-?\d{2}-?\d{4}$|^XXX-XX-XXXX$) sollte es tun.

---- ---- EDIT

Als Joel weist darauf hin, Sie auch ^(\d{3}-?\d{2}-?\d{4}|XXX-XX-XXXX)$ tun könnte, die ein wenig übersichtlicher ist.

+4

Ich würde abstrakt den^$ Teil aus, aber das sollte funktionieren. –

+0

Ich dachte, es wäre etwas Triviales, ich kenne die Regex-Regeln einfach nicht. Vielen Dank! –

+0

@Chris Conway: Ich kann das O'Reilly-Buch nicht empfehlen Mastering Regular Expressions von Jeffrey E F Friedl genug, auch das Regex-Tool Expresso (http://www.ultrapico.com/Expresso.htm) ist auch super. – Lazarus

1

Dann kann es

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

sein, wenn Sie x wollen auch gültig, wenn Sie den i Modifikator zum Ende hinzufügen:

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

Am zweiten Gedanken, die Regex oben akzeptiert

123-xx-xxxx 

auch, also je nachdem, ob Sie diese Form t wollen o akzeptiert werden oder nicht, können Sie Ihre ursprüngliche Form verwenden "oder" die andere Form:

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

Sie werden 1X3-XXX-4451 String gültig – Andrew

+0

Zum Beispiel wird 12XX0-123X auch übereinstimmen. Wahrscheinlich nicht was beabsichtigt war. –

+0

oh ha, wir geben den Text zur gleichen Zeit –

0

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

4

So haben Sie zur Zeit: ^\d{3}-?\d{2}-?\d{4}$

Was Sie brauchen, ist jeder zu ermöglichen diese numerischen Blöcke sollen stattdessen "X" sein. Dies ist auch ziemlich einfach als regex - nur an Ihrem einer bestehenden X haben statt \d in jedem der drei Orten sie auftritt: X{3}-?X{2}-?X{4}

Sie werden nicht einen numerischen Code mit und X-Code werden sollen die Kombination, Sie müssen nur entweder ein Fall oder den anderen zu ermöglichen, so wickeln Sie sie in Klammern und uns ein Pipe-Zeichen eine oder das andere zu spezifizieren, etwa so:

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

Sie werden wahrscheinlich auch obere zulassen möchten - oder kleingeschriebenes X. Dies kann unter Verwendung von [Xx] oder durch die Groß-/Kleinschreibung der Groß-/Kleinschreibung angegeben werden, wobei der Modifikator i außerhalb der Regex verwendet wird.

40

Um streng Antwort, die Sie in Frage:

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

arbeiten shoud. ;-)

Wenn Sie den Abschnitt "Valid SSNs" auf Wikipedia SSN Artikel lesen, dann wird klar, dass ein Regex für SSN-Validierung ein bisschen komplizierter ist.

Dementsprechend ein wenig genauer reine SSN Regex würde wie folgt aussehen:

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

+1 für den Link. – jensgram

+0

Vielen Dank hilfreich –

+1

Während ich diesen Kommentar schreibe, wurde diese Antwort zuletzt am 3. November 2010 bearbeitet. Der Wikipedia-Artikel besagt jedoch, dass sich die SSN-Validierung am 25. Juni 2011 geändert hat und mehr Nummern an mehreren Orten erlaubt. – Chris

1

Ein allgemeineres Spiel wäre:

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

Dies würde eine beliebige Folge von Zeichen übereinstimmen andere als "-" in 3-3-4 char-Konfiguration. Zum Beispiel:

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}$/; 
}