web-dev-qa-db-de.com

Fügen Sie das "Minuszeichen" in diesen regulären Ausdruck ein, wie?

Ich habe diese Regex:

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

Dies ist für ein Namensfeld in einer Formularüberprüfung.

Ich muss es möglich machen, Namen wie "Anna-nicole" einzugeben (beachten Sie das Minuszeichen) . Derzeit verursacht das Minuszeichen einen Fehler.

Ich muss diese Regex neu gestalten, damit ein Minuszeichen in den Namen eingefügt werden kann. am liebsten sollte ich es so machen, dass der name auch nicht mit einem Minuszeichen beginnen oder mit einem enden kann. Es dürfen nur Minuszeichen zwischen "Wörtern oder Namen" zulässig sein.

Weiß jemand, wie das geht?

Übrigens, es ist JavaScript.

28
user188962

Sie müssen das Minuszeichen mit einem Backslash verlassen.

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

Um zu verhindern, dass sie am Anfang oder am Ende verwendet werden, versuchen Sie Folgendes:

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

In vielen Regex-Dialekten muss in einer Zeichenklasse ein einfacher Bindestrich/Minus der erste oder letzte sein:

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

Negierte Charakterklassen:

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

Setzen Sie auch mit der eckigen Klammer die eckige Klammer vorne und den Bindestrich am Ende an:

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

Und wenn Sie sowohl eckige Klammern als auch Bindestriche ausschließen müssen:

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

Für die Frage könnte eine Interpretation lauten: Sie möchten, dass alphabetische Zeichen neben Bindestrichen bestehen, und am Anfang und Ende nur Leerzeichen zulassen. Vielleicht möchten Sie Apostrophe zulassen, an denen Sie Bindestriche zulassen, und aufeinander folgende Bindestriche vermeiden oder Apostrophe.

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

Warnung: Regex wurde formal mit Perl getestet, nicht mit JavaScript.

Anfang der Zeichenfolge, null oder mehr Leerzeichen; null oder mehr alphabetische Zeichen; null oder mehr Folgen von 'einem oder mehreren alphabetischen Zeichen plus Bindestrich oder Apostroph und einem oder mehreren alphabetischen Zeichen', gefolgt vom Ende der Zeichenfolge. Sie können nach dem ersten \s* und vor dem zweiten \s* einen zusätzlichen Satz von Klammern einfügen, um den gesamten Namen zu erfassen.

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

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

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

sollte es tun (es gibt einen unangenehmen Edge-Fall eines einzelnen Zeichennamens, auf den dieser nicht zutrifft. Ist ein einzelner Zeichenname zulässig oder nicht?)

1

Dies kann von der Implementierung abhängen. In Javascript wird der Backslash dem Minuszeichen in einer Zeichenklasse entkommen, aber in Oracle wird beispielsweise nur das Minuszeichen als erstes oder letztes Zeichen in die Zeichenklasse gesetzt.

0
Helge Moulding