2008-12-04 5 views
5

Ich möchte vorläufige Überprüfung tun, wenn eingegebene Zeichenfolge wie aussieht. Ich weiß, was es besteht aus 17 Buchstaben und Ziffern, sondern Buchstaben I, O und Q nicht innerhalb VIN erlaubt, so dass ich mit diesem regulären Ausdruck:Verwendet RegularExpressionValidator einen anderen Geschmack als Regex?

^[0-9A-Z-[IOQ]]{17}$ 

Nun, wenn ich eine Zeichenfolge wie 1G1FP22PXS2100001 mit RegularExpressionValidator überprüfen Sie es nicht , aber CustomValidator mit dieser OnServerValidate-Ereignisbehandlungsroutine

Regex r = new Regex("^[0-9A-Z-[IOQ]]{17}$"); 
args.IsValid = r.IsMatch(TextBox1.Text); 

funktioniert gut.

Experimente zeigen, was RegularExpressionValidator Character Class Subtraction nicht unterstützt, aber Regex Klasse tut.

Jetzt bin ich interessiert, warum diese beiden .NET-Klassen verschiedene Regex-Aromen verwenden? Ist das irgendwo dokumentiert?

+0

Ich habe die Links direkt in meine Antwort eingefügt, anstatt sie in den Kommentaren zu verstecken. – VonC

Antwort

5

Der RegularExpressionValidator unterstützt auch die clientseitige Validierung mithilfe von JavaScript, wobei die JavaScript Regex-Engine verwendet wird. Der Unterschied, den Sie sehen, ist der Unterschied zwischen der JavaScript- und der .NET Regex-Implementierung. Sie können die clientseitige Validierung deaktivieren und so den Validator zwingen, die .NET-Regex-Engine zu dem Preis des zusätzlichen Post-Back zu verwenden.

7

keine direkte Antwort, sondern nur eine offensichtliche Bemerkung:

Wenn aus irgendeinem Grund Zeichenklasse Subtraktion nicht unterstützt wird, immer Sie als Abhilfe verwenden können:

^[0-9A-HJ-NPR-Z]{17}$ 

zu dokumentieren, was Ich habe die Kommentare dieser Frage eingegeben:

Der Artikel How to: Validate Against Patterns for ASP.NET Server Controls, erwähnt th an der Javascript regex Validator clientseitige weiß nicht „Zeichenklasse Subtraktion“

Wie in RegularExpressionValidator Class .Net documentation erwähnt:

Beide serverseitigen und clientseitige Validierung durchgeführt werden, es sei denn, der Browser nicht unterstützt Die clientseitige Validierung oder die clientseitige Validierung wird explizit deaktiviert (indem die Eigenschaft EnableClientScript auf false gesetzt wird).

Die Validierungsimplementierung für reguläre Ausdrücke unterscheidet sich auf dem Client geringfügig von der auf dem Server. Auf dem Client wird JScript-Syntax für regulären Ausdruck verwendet. Auf dem Server wird System.Text.RegularExpressions..::.Regex Syntax verwendet.
JScript-Syntax für reguläre Ausdrücke ist eine Teilmenge von System.Text.RegularExpressions..::.Regex Syntax.
Es wird daher empfohlen, JScript-Syntax für reguläre Ausdrücke zu verwenden, um die gleichen Ergebnisse auf dem Client und dem Server zu erzielen.

Ein weiteres Beispiel dieser Nebenwirkung (verschiedene Regex-Varianten zwischen Server und Client Seiten) in RegularExpressionValidator woes Blog-Eintrag erwähnt.

+0

IMHO, das ist nicht die Problemumgehung, das ist der einzige Weg, es zu tun. Ich bin mir nicht bewusst, dass eine Sache wie "Zeichenklassensubtraktion" überhaupt existiert. Oder macht es einen wirklich seltsamen Regex-Geschmack? – Tomalak

+0

Es tut seit 2004 in .Net Regex-Engine, aber wie von http://msdn.microsoft.com/en-us/library/6xh899wy(VS.85).aspx, der Javascript Client-Seite Regex-Validator weiß nicht, "Zeichenklasse Subtraktion" ... – VonC

+0

Wie erwähnt in http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.regularexpressionvalidator.aspx, auf dem Client, JScript Regular- Ausdruck Syntax wird verwendet. Auf dem Server wird die Syntax System.Text.RegularExpressions .. ::. Regex verwendet. => JScript Regular Expression Syntax sollte verwendet werden. – VonC

Verwandte Themen