2017-07-27 3 views
-1

Ich habe versucht, eine mehr oder weniger komplexe RegEx für JS zu schreiben. Es besteht alle meine Tests außer zwei und ich weiß nicht warum. Dies ist der CodeWie verwende ich den "or" Befehl in JS RegEx richtig?

function telephoneCheck(str) { 
    regEx1 = /^[1]\s(\d{3}[-]){2}\d{4}|(\d{3}[-]){2}\d{4}$/; 
    regEx2 = /^\d{10}$/; 
    regEx3 = /^[1]\s(\d{3}\s){2}\d{4}|(\d{3}\s){2}\d{4}$/; 
    regEx4 = /^[1]\s[(]{1}\d{3}[)]{1}\d{3}[-]{1}\d{4}|[(]{1}\d{3}[)]{1}\d{3}[-]{1}\d{4}$/; 
    regEx5 = /^[1]\s[(]{1}\d{3}[)]{1}\s\d{3}[-]{1}\d{4}|[(]{1}\s\d{3}[)]{1}\d{3}[-]{1}\d{4}$/; 
    if (regEx1.test(str) || regEx2.test(str) || regEx3.test(str) || regEx4.test(str) || regEx5.test(str)) { 
    return true; 
    } 
    else { 
    return false; 
    } 
} 

und das sind die beiden Tests es nicht richtig übergeben (beide sollen als false zurückkommen, aber ich bekomme true statt): telephoneCheck("2(757)622-7382") und telephoneCheck("(555-555-5555"). Meine Frage ist, wie ich den | (oder) -Operator richtig benutze (ich denke, das würde meinen Code viel schöner aussehen lassen) und wie ich einen Ausdruck innerhalb von regEx beschreiben könnte, um ein bestimmtes Zeichen zu finden (zB die "1" am Anfang) der Nummer)? Ich habe es mit [1]{1} oder [1]$ getan, aber es schien nicht zu funktionieren. Danke für Hinweise und Anregungen!

+1

Zu viele Fragen: konzentrieren Sie sich auf eins. – trincot

+0

Keine Notwendigkeit für '{1}'. – trincot

Antwort

2

wie ich einen Ausdruck innerhalb REGEX beschreiben (am Anfang der Nummer beispielsweise die „1“)

Um ein bestimmtes Zeichen zu entsprechen, ein bestimmtes Zeichen zu entsprechen, genau das Zeichen. x ist eine gültige Regex-Zeichenfolge, die mit dem Buchstaben "x" übereinstimmt. Um einem Sonderzeichen zu entsprechen, musst du es zuerst schließen. Die Regex . entspricht einem beliebigen Zeichen; Der Regex \. entspricht einem Punkt.

Beachten Sie, dass die Regex x entspricht [x] in dem sie die gleichen Dinge übereinstimmen, aber ersteres ist kürzer und einfacher zu lesen. Wenn Sie die Wahl haben, verwenden Sie einfach das einzelne Zeichen direkt (escape wenn nötig!) Und vergessen Sie die [ ].

Ihre Regex enthalten Ausdrücke wie [-], [(] und [1]. Löschen Sie die Klammern. Auf der zweiten Seite müssen Sie der ( entkommen.

Ausdrücke wie [(]{1} entsprechen \(. Die {1} bedeutet nur, den vorherigen Artikel einmal zu vergleichen. Nun, das Verwenden dieses Elements führt das selbe aus. Zwei Zeichen sind viel kürzer als sechs und machen Ihre Regex einfacher zu lesen.

wie benutze ich | (oder) richtiger Operator

Die Verwendung des | Operators ist einfach genug. Es wird übereinstimmen, was auf der linken Seite oder auf der rechten Seite ist. Schließe es in Klammern, um die Übereinstimmung einzuschränken. Zum Beispiel passt a|bc "a" oder "bc". (a|b)c entspricht "ac" und "bc".

+0

Sehr schöne und detaillierte Erklärung, danke @Amy! –

0

Das Hauptproblem, das Sie haben, ist, dass die ^ und $ Anker nur auf der Seite der | sie sind eingeschaltet sind. Aber Sie möchten, dass alle Muster, die Sie auf beiden Seiten haben, sowohl mit ^ als auch mit $ übereinstimmen.

Also statt ^ | $, tun ^( | )$ oder ^ $|^ $.

Wie andere gesagt haben, können Sie eine Menge vereinfachen.