2010-10-24 11 views
23

Ich habe diese regex:Fügen Sie das "Minuszeichen" in diesen regulären Ausdruck ein, wie?

var alphaExp = /^[a-zA-ZåäöÅÄÖ\s]+$/; 

Dies ist für einen Namen-Feld in einem Formular-Validierung.

Ich muss es möglich machen, Namen wie diese "Anna-Nicole" (beachten Sie das Minuszeichen). Momentan verursacht das Minuszeichen einen Fehler.

Ich muss diese Regex neu erstellen, so dass ein Minuszeichen in den Namen aufgenommen werden kann; vorzugsweise sollte ich es so machen, dass der Name auch nicht mit einem Minuszeichen beginnen oder mit einem beenden kann. Nur Minuszeichen zwischen "Wörtern oder Namen" sollten erlaubt sein.

Weiß jemand, wie man das macht?

BTW, es ist JavaScript.

+0

Sie erlauben derzeit Leerzeichen an beiden Enden - möchten Sie sie auch begrenzt? Und willst du "Nancy - O'Hara" (mit den Leerzeichen um die Striche) verbieten, und was ist mit dem Apostroph im Nachnamen? –

+0

@ Jonathan: Ja das würde ich auch gerne, jetzt wo du es erwähnst. –

Antwort

29

Sie müssen das Minuszeichen mit Backslash entfernen.

var alphaExp = /^[a-zA-ZåäöÅÄÖ\s\-]+$/; 

Um sich verwendet es am Anfang oder am Ende zu stoppen, versuchen, etwas wie folgen aus:

var alphaExp = /^[a-zA-ZåäöÅÄÖ\s]+[a-zA-ZåäöÅÄÖ\s\-]*[a-zA-ZåäöÅÄÖ\s]+$/; 
+0

Wird dies verhindern, dass sie Minuszeichen am Anfang oder Ende des Feldes verwenden? –

+0

Ersetzen Sie das "+" - Zeichen durch {1}, um zu verhindern, dass NUR das erste und letzte Zeichen "-" oder das erste + mit {5} wird, wenn es nach 5 Zeichen erlaubt ist. http://www.addedbytes.com/cheat-sheets/download/regular-expressions-cheat-sheet-v2.png –

+1

Es könnte sich herausstellen, dass a) das Minus am Anfang oder am Ende stehen sollte und b) das Entkommen ist in vielen Regex-Implementierungen nicht erforderlich – redreinard

1
/^[a-zA-ZåäöÅÄÖ\s]+[a-zA-ZåäöÅÄÖ\s\-]*[a-zA-ZåäöÅÄÖ\s\]+$/ 

sollte es tun (es gibt einen unangenehmen Rand Fall eines einzelnen Charakternamen sein ., die dies nicht übereinstimmen Ist ein einzelnes Zeichen Namen erlaubt oder nicht)

13

in vielen Regex-Dialekte, in einer Zeichenklasse, ein einfacher Bindestrich/minus muss zuerst oder zuletzt sein:

/^[-a-zA-ZåäöÅÄÖ\s]+$/ 
/^[a-zA-ZåäöÅÄÖ\s-]+$/ 

negierte Zeichenklassen: zu

/^[^-a-zA-ZåäöÅÄÖ\s]+$/ 
/^[^a-zA-ZåäöÅÄÖ\s-]+$/ 

Mit fast eckiger Klammer, legen Sie die eckige Klammer an der Front und den Bindestrich am Ende:

/^[]a-zA-ZåäöÅÄÖ\s-]+$/ 

Und wenn Sie ausschließen beide schließen eckige Klammern und Bindestriche, dann:

/^[^]a-zA-ZåäöÅÄÖ\s-]+$/ 

Für die Frage könnte eine Interpretation lauten: Sie möchten auf alphabetische Zeichen um Bindestriche herum bestehen und nur Leerzeichen am Anfang und am Ende zulassen, und Sie möchten möglicherweise Apostrophen zulassen, bei denen Sie Bindestriche zulassen und konsekutive vermeiden möchten Bindestriche oder Apostrophe.

/^\s*[a-zA-ZåäöÅÄÖ]*([a-zA-ZåäöÅÄÖ]+[-'][a-zA-ZåäöÅÄÖ]+)*\s*$/ 

Warnung: regex formal mit Perl, JavaScript nicht getestet.

Beginn der Zeichenfolge, null oder mehr Leerzeichen; null oder mehr alphabetische Zeichen; Null oder mehr Folgen von "einem oder mehreren Buchstaben plus Bindestrich oder Apostroph und einem oder mehreren Buchstaben", gefolgt vom Ende des Strings. Sie könnten einen zusätzlichen Satz Klammern nach dem ersten \s* und vor dem zweiten \s* schlagen, um den vollständigen Namen zu erfassen.

Für Anna-nicole würde der erste Alpha-Ausdruck Ann entsprechen und der andere Alpha-Ausdruck würde a-nicole entsprechen. Für Anonymous würde der erste Ausdruck der gesamten Zeichenfolge entsprechen, der zweite wäre leer. Für O'Reilly wäre der erste Ausdruck leer und der zweite würde der gesamten Zeichenfolge entsprechen. Namen wie "C - d" und "Who'Me" würden abgelehnt (kein wiederholter Bindestrich oder Apostroph erlaubt). Es würde Smith-Jones-and-Son als einen Namen und Smith-And-O'Reilly erlauben. Es werden keine führenden oder abschließenden Bindestriche oder Apostrophe erlaubt.

Wenn Sie "Vorname Nachname" zulassen möchten, benötigen Sie zwei Chargen des "Kerns" der obigen Regex mit \s+ dazwischen. Usw.

+0

Danke Jonathan, aber sollte ich all diese kombinieren? Weiß nicht, was sie alle meinen, sag mir einfach, welches du wählen sollst :) –

+1

@Camran: Wähle das, was du brauchst - was wahrscheinlich eines der ersten beiden ist. Die zweiten beiden befassen sich mit einer negierten Zeichenklasse, wobei das erste Zeichen nach dem "" steht. Das letzte ist noch esoterischer. Sie befassen sich jedoch nicht mit den komplexeren Problemen, die sicherstellen, dass Bindestrich nur zwischen Wörtern erscheint, nicht mit Leerzeichen usw. Ich bin halb versucht, die Antwort zu löschen - aber die Information darüber, wo Bindestriche platziert werden sollen in Klassen Klassen in regulären Ausdrücken ist immer noch nützlich (ich hoffe), auch wenn es nicht die größeren (und viel mehr) komplexe Probleme angeht. –

0

Dies kann von der Implementierung abhängen. In Javascript wird der umgekehrte Schrägstrich das Minuszeichen in einer Zeichenklasse umgehen, aber in Oracle zum Beispiel, nur das Minuszeichen zuerst oder zuletzt in der Zeichenklasse setzen wird den Trick tun.

+2

Pflege, um dem OP ein Beispiel zu geben, was du meinst? Zum Beispiel, indem Sie ihren Code fixieren? –

Verwandte Themen