2010-01-24 9 views
8

Ich möchte Benutzernamen validieren nach diesem Schema zum Ausdruck bringt:Regex, die „mindestens ein nicht-digit“

  1. Erlaubte Zeichen: Buchstaben, Zahlen, Bindestrich, Unterstrich
  2. Das erste Zeichen muss ein Buchstabe sein oder eine Anzahl
  3. Der Benutzername Alle Zahlen nicht

Dieser reguläre Ausdruck erfüllt 1 und 2 oben, aber ich kann nicht herausfinden, wie 3 zu erfüllen:

/^[a-zA-Z\d][\w\-]+$/ 

(I Rubin bin mit, wenn das relevant ist)

Antwort

10

nicht sehr effizient, aber einfach:

/^(?!\d+$)[a-zA-Z\d][\w\-]+$/

Der Look-Ahead bedeutet einfach: „Was folgt, ist kein String von Zahlen, die bis zum Ende gehen ".

+0

netter Trick ist verfügbar in Nicht-ruby regex Implementierungen? –

+0

+1 Schöne. Normalerweise meide ich Lookahead, weil ich sie nicht gut verstehe, aber das ist eine schöne Illustration, wie man sie benutzt. –

+0

@Mark: Nicht in allen, aber in den meisten. Python, PHP, Perl und Javascript sind diejenigen, von denen ich weiß, dass sie es unterstützen. –

1

Nicht ideal, aber einfach: einen zweiten Durchgang mit dem regex /^.*[a-zA-Z_\-].*$/

sicherzustellen, verwenden Sie einfach geht es sowohl, und Sie werden in Ordnung sein.

+2

'/ \ D /' würde genauso gut tun, wenn Sie einen zweiten Filter ausführen. Es muss nicht von Anfang bis Ende abgestimmt werden. –

+0

Der zweite Durchlauf kann einfach '[-a-z_]' sein (ich nehme an, dass Sie eine Groß-/Kleinschreibung nicht beachten; wenn nicht, dann '[-A-Za-z_]', natürlich. Kein Grund zur Sorge über Anfang, Ende oder irgendetwas anderes - wenn es das erste übergibt, vergewissere dich, dass irgendwo ein Buchstabe, ein Unterstrich oder ein Bindestrich steht – Jay

+0

Danke, ich war mir über Ruby nicht sicher, aber Java meldet nur eine Übereinstimmung, wenn der gesamte String Übereinstimmungen: Ich nehme an, dass \ D keine Ziffer ist? –

1

Wenn Sie mit zwei Durchgängen, ein einfacheres und schnelleren zweites Durchgang regexp gehen können:

/[^\d]/ 

Das gerade paßt alles, was nicht eine Zahl ist, und es braucht nur ein und es endet früh entsprechen. Sie müssen hier nicht unbedingt streng sein, da der erste Durchgang nicht zulässige Zeichen ablehnt.

0

würde ich die Regex verwenden, die Sie für die Validierung brauchen, und dann so etwas wie:

passwd.to_i.to_s.length != passwd.length 

zu überprüfen, ob passwd keine Ziffernfolge ist, nachdem es die primäre Validierung passiert.

0

Noch eine andere Art und Weise, auch wenn es nicht so gut wie Max 'durchführen kann:

/^[a-z0-9][-\w]*[-_a-z][-\w]*$/i 
Verwandte Themen