RegularExpressionValidator.ValidationExpression="\d{10}"
bedeutet nur Zahlen - maximal 10.
RegularExpressionValidator.ValidationExpression="\d{10,12}"
bedeutet nur Zahlen - 10, 11 oder 12.
Wie erzwingt man streng 10 oder 12 Symbole?
RegularExpressionValidator.ValidationExpression="\d{10}"
bedeutet nur Zahlen - maximal 10.
RegularExpressionValidator.ValidationExpression="\d{10,12}"
bedeutet nur Zahlen - 10, 11 oder 12.
Wie erzwingt man streng 10 oder 12 Symbole?
Ein Weg ist:
"\d{10}(\d{2})?"
Oder Sie könnten expliziter sein, auf Kosten einer geringen Leistung:
"^(\d{10}|\d{12})$"
Der Grund für die Anker im zweiten Ausdruck wird hier beschrieben:
Wenn Sie Probleme mit Mustervergleichskonstrukten haben, versuchen Sie, den Ausdruck mit "^(" und ")$" zu umschließen. Zum Beispiel wird "a|ab" zu "^(a|ab)$".
Aktualisierung
Ich war interessiert daran, warum \d{10}|\d{12}
nicht korrekt funktioniert hat, und entschied mich, in den Quellcode des Validierungsprogramms einzutauchen, um zu sehen, warum dies fehlschlägt.
Der RegularExpressionValidator
validiert sowohl serverseitig als auch clientseitig mit demselben regulären Ausdruck und im Fall von \d{10}|\d{12}
schlägt die Überprüfung auf der Clientseite für die Länge 12 fehl, funktioniert aber für die Länge 10. Der Quellcode zeigt, wie das Matching erfolgt:
var rx = new RegExp(val.validationexpression);
var matches = rx.exec(value);
return (matches != null && value == matches[0]);
Beachten Sie, dass dieser reguläre Ausdruck A|B
ist, aber wenn A übereinstimmt, wird B nicht einmal überprüft - der reguläre Ausdruck ist nicht "gierig" über die Pipe-Operation - er nimmt die erste Übereinstimmung, die er findet. Daher führt das Ergebnis des Matchens dieses regulären Ausdrucks dazu, dass die zehnstellige Übereinstimmung erfolgreich ist, auch wenn Sie eine zwölfstellige Eingabe eingeben. Aber dann schlägt der Test value == matches[0]
fehl, weil die Übereinstimmung nicht der vollständige String ist.
Das Vertauschen der Reihenfolge der Begriffe, d.h. das Schreiben von \d{12}|\d{10}
, funktioniert, weil die längere Übereinstimmung zuerst getestet wird und die kürzere Übereinstimmung nur getestet wird, wenn die lange Übereinstimmung fehlschlägt.
Lektion gelernt: Es ist eine gute Idee, bei Verwendung des Pipe-Symbols im RegularExpressionValidator
explizit Anker zu verwenden, um sich nicht um die Reihenfolge der Begriffe sorgen zu müssen.
^\d{10}$|^\d{12}$
Die beiden ^$
sind wichtig, wenn Sie genau 10 oder 12 Ziffern möchten.
Übrigens, Wenn Sie viele reguläre Ausdrücke erstellen, ist diese Website großartig: http://rubular.com/
Viel Spaß
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.