4 Stimmen

RegularExpressionValidator.ValidationExpression um die Länge auf 10 oder 12 Symbole zu erzwingen

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?

7voto

Mark Byers Punkte 761508

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.

5voto

Nicolas Guillaume Punkte 7432

^\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ß

3voto

Dillie-O Punkte 28749

Verwenden Sie den regulären Ausdruck "Pipe"

RegularExpressionValidator.ValidationExpression = "\d{10}|\d{12}"

0voto

Zenon Punkte 1426
\d{10}(?:\d{2}){0,1}

sollte 10 Ziffern oder 10+2 Ziffern entsprechen. Der Teil (?:.....) ist eine nicht erfassende Gruppe

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