3 Stimmen

Regex: Übereinstimmung mit einer Zeichenfolge, die Zahlen und Buchstaben enthält, aber nicht mit einer Zeichenfolge, die nur aus Zahlen besteht

Pregunta

Ich möchte in der Lage sein, eine einzige Regex (wenn möglich) zu verwenden, um zu verlangen, dass eine Zeichenfolge passt [A-Za-z0-9_] aber nicht zulässt:

  • Zeichenketten, die nur Zahlen oder/und Symbole enthalten.
  • Zeichenketten, die mit Symbolen beginnen oder enden
  • Mehrere Symbole nebeneinander

Gültig

  • test_0123
  • t0e1s2t3
  • 0123_test
  • te0_s1t23
  • t_t

Ungültig

  • t__t
  • ____
  • 01230123
  • _0123
  • _test
  • _test123
  • test_
  • test123_

Gründe für die Regeln

Der Zweck ist, Benutzernamen für eine Website zu filtern, an der ich arbeite. Ich habe mir die Regeln aus bestimmten Gründen zurechtgelegt.

  • Benutzernamen, die nur aus Zahlen und/oder Symbolen bestehen, können zu Problemen bei der Weiterleitung und bei Datenbankabfragen führen. Die Route für /users/#{id} ermöglicht id entweder die Benutzerkennung oder der Name des Benutzers sein. Namen und IDs sollten also nicht kollidieren können.

  • _test sieht seltsam aus, und ich glaube nicht, dass es sich um eine gültige Subdomain handelt, d. h. _test.example.com

  • Ich mag das Aussehen von t__t als Subdomäne, d.h. t__t.example.com

0voto

Welbog Punkte 57431
(?=.*[a-zA-Z].*)^[A-Za-z0-9](_?[A-Za-z0-9]+)*$

Das hier funktioniert.

Vergewissern Sie sich, dass mindestens ein Buchstabe in der Zeichenfolge enthalten ist, und beginnen Sie dann mit der Verarbeitung der Eingabe. Jedes Mal, wenn ein Unterstrich vorkommt, muss vor dem nächsten Unterstrich eine Zahl oder ein Buchstabe stehen.

0voto

Rado Punkte 8144

Hier ist es:

^(([a-zA-Z]([^a-zA-Z0-9]?[a-zA-Z0-9])*)|([0-9]([^a-zA-Z0-9]?[a-zA-Z0-9])*[a-zA-Z]+([^a-zA-Z0-9]?[a-zA-Z0-9])*))$

Wenn Sie die zu akzeptierenden Symbole einschränken möchten, ersetzen Sie einfach alle [^a-zA-Z0-9] durch [], die alle zulässigen Symbole enthalten

0voto

Alan Moore Punkte 70949
/^(?![\d_]+$)[A-Za-z0-9]+(?:_[A-Za-z0-9]+)*$/

Ihre Frage ist im Wesentlichen dieselbe wie éste mit der zusätzlichen Bedingung, dass mindestens eines der Zeichen ein Buchstabe sein muss. Die negative Vorausschau - (?![\d_]+$) - kümmert sich um diesen Teil und ist viel einfacher (sowohl zu lesen als auch zu schreiben) als es in die grundlegende Regex einzubauen, wie es einige andere versucht haben zu tun.

-2voto

rpjohnst Punkte 1577
[A-Za-z][A-Za-z0-9_]*[A-Za-z]

Das würde für Ihre ersten beiden Regeln funktionieren (da für die zweite Regel ein Buchstabe am Anfang und am Ende erforderlich ist, werden automatisch Buchstaben benötigt).

Ich bin mir nicht sicher, ob die dritte Regel mit Regexen möglich ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X