2009-08-24 6 views
2
  1. Max Länge des Strings ist 6.
  2. Die Zeichenfolge höchstens 2 Ziffern
  3. String an enthalten sollte enthalten sollte, höchstens 4 Alphabete

So sollten die folgenden BeispieleRegex höchstens 2 Zahlen zu validieren und höchstens 4 Alphabete in einem String der Länge 6

abcd22 

a1cd3d 

11acde 

a1c 

1ad 
+2

Was ist mit einer Zeichenfolge ohne Ziffern und ohne Buchstaben? –

+0

Kann die Zeichenfolge weniger als die 2 und 4 Grenzwerte enthalten? Ist "1a2" gültig? – Amy

+0

ja es ist gültig, aber String keine Ziffern und keine Buchstaben ist nicht gültig – kurozakura

Antwort

1

Was Sie wollen, ist in regulären Ausdrücken nicht wirklich möglich, da reguläre Ausdrücke nicht zählen können, was hier erforderlich wäre. In der Tat scheinen reguläre Ausdrücke zu sein, um Zeichen in direkter Folge zählen zu können, z. in diesem Fall:

/x{2,3}/ # 2 or 3 ‘x’s 

... aber das ist eigentlich nicht zu zählen, weil es nur eine Abkürzung für diesen Ausdruck ist:

/xxx?/ 

d 2 x ‚s, gefolgt von einer optionalen dritten gefolgt.

Ihr Ausdruck, auf der anderen Seite, würde zwei verschiedene Zähler über den ganzen Automaten verfolgen müssen, der den Ausdruck darstellt. Das ist einfach nicht möglich in klassischen regulären Ausdrücken (und immer noch sehr schwer mit moderneren Inkarnationen von regulären Ausdrücken, die Pushdown-Automaten verwenden, um Zustände zu speichern).

0

Regexes nicht gut übereinstimmen sind auf Spur Zustand gehalten wird. Sie könnten dies tun mit einer Regex, aber es wäre viel einfacher, einen einfachen Rechner und kleines Regexes Programm zu verwenden:

bool IsValid(string s) 
{ 
    int numInts = 0; 
    int numChars = 0; 
    Regex isDigit = new Regex(@"\d"); 
    Regex isChar = new Regex(@"[a-zA-Z]"); // NOTE: will NOT catch non english letters 

    if (s.Length() <= 6) 
    { 
     return false; 
    } 

    foreach (char c in s) 
    { 
     if (isDigit.IsMatch(c)) 
     { 
      ++numInts; 
     } 
     if (isChar.IsMatch(c)) 
     { 
      ++numChars; 
     } 
    } 

    return numInts == 2 && numChars == 4; 

}

Constify/args umbenennen, um Ihre Bedürfnisse zu erfüllen.

Natürlich, wenn Sie sehr C mögen möchten, könnten Sie einen numerischen Vergleich auf dem Char, aber das wird Sie noch weiter weg von einer soliden, robusten Lösung.

2

Ich würde einen ODER-Test eine Reihe von regulären Ausdrücken tun:

/^[a-z0-9]{0,6}$/ # at most 6 characters 
/([a-z].*){5}/ # more than 4 letters 
/(\d.*){3}/  # more than 2 digits 

So:

if (/^[a-z0-9]{0,6}$/ and !(/([a-z].*){5}/ or /(\d.*){3}/)) { 
    print "valid"; 
} 
+0

in diesem Fall "a/5" validiert ... –

+0

Ich sehe nichts in der Frage, die implizieren würde, dass andere Zeichen nicht validieren sollten – naumcho

+0

max sollte 4 Buchstaben und maximal 2 Ziffern, dh Buchstaben <= 4 und Ziffern <= 2 – kurozakura

1

Ich würde nicht Regex für diese verwenden, außer vielleicht für alphanumerische zu überprüfen/weniger als 6: /^[0-9a-z]{1,6}$/i. Aber die Zählbedingungen, während sie mit Regexen technisch machbar sind, werden durch einfaches Zählen besser gemacht.

So würde ich

  1. Testen Sie, ob es Regex passt /^[0-9a-z]{1,6}$/i
  2. Dann wird eine for-Schleife verwenden chararcter classe zu zählen OCCURENCES
0

Sie könnten dies mit negativen Lookaheads tun.

(?!\d{5})(?![a-z]{3})[a-z0-9]{1,6} 

(?!\d{5}) schlägt fehl, wenn 5 oder mehr Ziffern

(?![a-z]{3}) schlägt fehl, wenn 3 oder mehr Zeichen gefunden werden

Wenn diese beiden Pässe gefunden werden, überprüfen wir schließlich, dass es zwischen 1 und 6 alphanumerischen Zeichen mit (?!\d{5})(?![a-z]{3})[a-z0-9]{1,6}

Verwandte Themen