Was ist ein Regex für Twitter-ähnliche Namen?

8

Ich habe für eine Weile programmiert, aber bis vor kurzem hatte ich nie die Notwendigkeit für reguläre Ausdrücke. Ich muss einen regulären Ausdruck machen, der Benutzernamen wie Twitter akzeptiert. Grundsätzlich möchte ich jeweils einen Unterstrich zulassen. Es kann mehr als einen Unterstrich in einem Namen geben, aber diese sollten keine fortlaufenden Zeichen sein. Alphanumerische Zeichen sind ebenfalls erlaubt. Aber Zahlen können keinen Namen beginnen.

Namen wie

  • _myname67
  • myname67
  • mein_name
  • _my_67_name _

sind gültig, aber

  • 94myname
  • __ meinname
  • mein__name
  • mein Name

sind nicht gültig.

Ich habe mit Rubular gespielt und mir ein paar Regexes ausgedacht:

  • /^[^0-9\s+](_?[a-z0-9]+_?)+$/i
  • /^([a-z_?])+$/i

Das Problem, mit dem ich immer wieder auftrete, ist, dass diese mehr als einen Unterstrich haben.

    
iGbanam 16.05.2011, 17:11
quelle

6 Antworten

2

Versuchen Sie Folgendes ^([a-zA-Z](_?[a-zA-Z0-9]+)*_?|_([a-zA-Z0-9]+_?)*)$

Ich habe zwei Fälle getrennt: Das Wort beginnt mit einem Buchstaben und beginnt mit einem Unterstrich. Wenn Sie Namen, die nur aus einem Symbol bestehen, nicht zulassen möchten, ersetzen Sie nur * durch + .

Die Lösung von maerics hat ein Problem, sie erfasst keine Namen, die _ an zweiter Stelle haben, wie zum Beispiel m_yname

    
Hrant Khachatrian 16.05.2011, 17:36
quelle
10

Bearbeitet

%Vor%

Sie sollten ( ) nur für Teilstrings verwenden, die Sie erfassen möchten. (?: ) wird für Gruppierungen verwendet, die nicht erfasst werden sollen. Es empfiehlt sich, sie immer dann zu verwenden, wenn Sie nicht speziell auf diese Teilzeichenfolge verweisen müssen. Es lässt auch die Regex schneller laufen.

    
sawa 16.05.2011 17:22
quelle
1

Manche Dinge lassen sich nur mit regulären Ausdrücken ausdrücken und sind im Allgemeinen schreibgeschützt (das heißt, sie können in letzter Zeit nicht mehr gelesen und verstanden werden). Sie können eine einfachere Regexp verwenden (wie die beiden, die Sie schreiben konnten) und nach doppelten Unterstrichen in Ihrem Ruby-Code suchen. Es tut nicht weh:

if username =~ /^[^0-9](_?[a-z0-9]+_?)+$/i and username.count('__') == 0 then ...

    
Gabriel 16.05.2011 17:20
quelle
1

Das scheint zu funktionieren:

%Vor%

Updates : korrigiert für numerische Einschränkungen und Groß- / Kleinschreibung.

    
DigitalRoss 16.05.2011 17:48
quelle
0
%Vor%     
maerics 16.05.2011 17:26
quelle
0

Einige Probleme können nicht mit nur einem regulären Ausdruck gelöst werden ... besonders, wenn Sie die Abwesenheit eines Musters sowie das Vorhandensein eines anderen Musters überprüfen möchten.

Manchmal ist es besser (und auf jeden Fall besser lesbar), Ihre Bedingungen in mehrere reguläre Ausdrücke zu zerlegen und nacheinander mit jedem von ihnen in Einklang zu bringen.

Zusätzlich zu Ihren regulären Ausdrücken, um nach gültigen Zeichen zu suchen, sollten Sie auch einen regulären Ausdruck verwenden, um das Vorhandensein von zwei Unterstrichen zu prüfen, und dann das Ergebnis INVERTIEREN (dh den Namen auswerfen, wenn es dem Muster entspricht). .

    
Platinum Azure 16.05.2011 17:24
quelle