2013-02-13 1 views
11

Gibt es eine prägnante Art und Weise zum Ausdruck bringen:Reguläre Ausdrücke: Wie to Express w Ohne Unders

\w but without _ 

Das heißt, "alle Zeichen in \ enthalten w, außer _"

Ich frage dies, weil ich nach der prägnantesten Möglichkeit suche, die Domain-Namensvalidierung auszudrücken. Ein Domänenname kann Groß- und Kleinbuchstaben, Zahlen, Punktzeichen und Bindestriche, aber keine Unterstriche enthalten. \ w enthält alle oben genannten Elemente sowie einen Unterstrich. Also, gibt es eine Möglichkeit, einen Unterstrich von \ w über Regex-Syntax zu "entfernen"?

Bearbeitet: Ich frage nach Regex wie in PHP verwendet.

Vielen Dank im Voraus!

+2

Hängt vom Regex-Geschmack ab. Welche Sprache verwendest du? Am einfachsten wäre es jedoch, '[A-Za-z0-9]' zu verwenden. '\ w' enthält (normalerweise) ** nicht ** Bindestriche oder Punkte. –

+1

Je nach Geschmack kann '\ w' Unicode-Zeichen unterstützen. Wenn Sie sich nicht ganz sicher sind, was "\ w" darstellt, verwenden Sie am besten die Zeichenklasse '[]' und listen sie alle normal auf. – nhahtdh

Antwort

20

die folgende Zeichenklasse (in Perl)

[^\W_] 

\W ist die gleiche wie [^\w]

+1

Gute Idee, aber dein Atom ist nicht korrekt. – Bergi

+0

erklären Sie mir, wie es nicht ist .... und beachten Sie, dass das '?:' Teil nur sagen, nicht wirklich die Gruppe von dem Atom gefunden – protist

+1

@protist: Das Atom ist falsch. '\ w' passt zu' _', und '|' ist alternierend und verhält sich wie OR, nicht UND – nhahtdh

3

auf der sicheren Seite zu sein, in der Regel, wir Zeichenklasse verwenden:

[a-zA-Z0-9.-] 

Die regex "Fragment" oben Match englische Alphabet und Ziffern sowie Zeitraum . und dash -. Es sollte sogar mit der grundlegendsten Regex-Unterstützung funktionieren.

Kürzere können besser sein, aber nur, wenn Sie genau wissen, was es darstellt.

Ich weiß nicht, welche Sprache Sie verwenden. In vielen Motoren entspricht \w[a-zA-Z0-9_] (einige erfordern dafür den "ASCII-Modus"). Einige Engines unterstützen jedoch Unicode für Regex und können \w so erweitern, dass sie Unicode-Zeichen entsprechen.

+0

Dies schließt alle Unicode-Zeichen wie "äö" usw. aus. – MrD

+0

@MrD: Yup, der beste Weg ist, Regex nicht zu benutzen, um überhaupt eine Domain-Validierung durchzuführen. – nhahtdh

1

Einige Regex-Varianten haben eine negative Lookbehind Syntax Sie verwenden könnten: (?!_)\w

Aber ich denke, das Schreiben [a-zA-Z0-9.-] mehr lesbar ist:

\w(?<!_) 
+2

Negative Lookaheads werden häufiger unterstützt als negative Lookbehinds. –

+1

@JosephSilber True. Konzeptionell finde ich "gib mir einen Wortcharakter ... aber keinen Unterstrich" etwas leichter als "das nächste, was ich will, sollte kein Unterstrich sein ... sonst gib mir ein Wortcharakter" zu folgen, wenn negative Lookbehinds * sind * jedoch verfügbar. –

4

Sie einen negative lookahead nutzen könnten.

+1

Das wäre '(?! _) \ W', nein? –

+0

Danke für die Behebung – Bergi

+0

Look-around ist langsamer als normal passend. Kann aber nicht wichtig sein, obwohl – nhahtdh

2

Wenn mein Verständnis richtig ist \w bedeutet [A-Za-z0-9_] Zeitraum Zeichen, Bindestriche sind nicht enthalten.

info: http://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes

also denke ich, was Sie wollen, ist [a-zA-Z0-9.-]

+1

Die Probleme kommen damit, wenn Sie nicht englische Buchstaben haben. –

+0

@ ZoltánTamási ** Domain-Name **, nicht-englischer Buchstabe? – Kent

+0

@Kent - [ICANN genehmigt nicht-lateinische Domain-Namen] (http://news.cnet.com/8301-1023_3-10387139-93.html). –

1

Ich würde mit [^ _] starten, und dann denken Sie an, was sonst noch Zeichen muss ich verneinen. Wenn Sie eine Tastatureingabe filtern müssen, können Sie alle unerwünschten Zeichen ganz einfach aufzählen.

+1

Dies ist ein sehr schlechter Ansatz. Der Domainname hat einen definierten Satz erlaubter Zeichen, so dass ein White-Listing durchgeführt werden kann. Wenn Sie eine schwarze Liste erstellen, müssen Sie sich darum kümmern, welches Unicode-Zeichen Sie ebenfalls ablehnen müssen. – nhahtdh

+0

@nhahtdh, ich habe gezählt, dass Doamin Namen können Unicode-Zeichen (z. B. akzentuierte Vokale) haben. Ich denke, es ist ziemlich schwer, genau die ultimative Lösung für eine korrekte weiße Liste zu finden. –

+0

Es gibt Spezifikationen dafür - es ist mühsam, aber definiert. Die Leute neigen dazu, Dinge zu vergessen/übersehen, wenn sie Blacklists machen. – nhahtdh

0

Sie so etwas schreiben kann:

\([^\w]|_)\u 

Wenn Sie preg_filter mit dieser Zeichenfolge verwenden Jedes Zeichen in \ w (außer _ Unterstrich) wird gefiltert.