Anmerkung zum Validieren von numerischen Benutzereingaben
Natürlich ermöglichen es reguläre Ausdrücke, zu überprüfen, ob ein String eine Zahl ist. Jedoch gibt es viele Eigenschaften, die zum Beispiel bei einer Kommazahl berücksichtigt werden müssen: Zu Beginn kann optional ein Plus- oder Minuszeichen stehen, das Komma kann vorkommen, muss aber nicht, es darf nicht das erste Zeichen oder letzte Zeichen sein und höchstens einmal vorkommen, weiters muss jedes Zeichen, das kein Komma oder Plus-/Minuszeichen ist, eine Ziffer sein, … All dies ließe sich noch erledigen, erfordert aber bereits ein relativ komplexes Muster. Und dann gibt es bei einigen Zahlentypen noch eine Eigenschaft, welche fast unmöglich zu berücksichtigen ist: Int hat eine Länge von 32 Bit. Zu lange Zahlen führen bei der Konvertierung zur Ausnahme OverflowException. Daher sollte man zur Validierung von numerischen Benutzereingaben auf Regex verzichten und die vom .NET-Framework (ab .NET 2.0) bereitgestellten Methoden nutzen: Zur Überprüfung, ob eine Zeichenfolge zu Int konvertiert werden kann, gibt es Int32.TryParse und für Double Double.TryParse.
Saturday, January 9, 2010
regex Validieren von numerischen Benutzereingaben
Was ist Regex?
1. Was ist Regex
Regex ist die Abkürzung für „Regular Expressions“, zu Deutsch: „Reguläre Ausdrücke“. Wikipedia definiert Reguläre Ausdrücke als eine Zeichenkette, die der Beschreibung von Mengen beziehungsweise Untermengen von Zeichenketten mit Hilfe bestimmter syntaktischer Regeln dient. Regex ist ein mächtiges Werkzeug zum Validieren und Bearbeiten von Zeichenketten.
2. Verwendung von Regex in C#
Um Regex in einem C#-Programm nutzen zu können, muss zunächst der Namespace System.Text.RegularExpressions eingebunden werden: using System.Text.RegularExpressions; Um die Ausdrücke zu testen, erstellt man dann eine Instanz der Klasse Regex. Allgemein sieht dieser Befehl so aus: Regex myRegex = new Regex("[Pattern]"); Unter Pattern versteht man ein Muster, welches die Voraussetzungen beschreibt, wie eine gültige Zeichenkette auszusehen hat. Das Pattern kann beispielsweise beschreiben, dass eine Zeichenfolge nur gültig ist, wenn diese nur aus Zeichen von A – Z besteht. Oder, wenn diese nur Buchstaben, Ziffern und Strichpunkte enthält. Anstelle von [Pattern] übergibt man dem Konstruktor das Suchmuster als String. Um zum Beispiel nur Zahlen zuzulassen, wäre folgendes Pattern geeignet: ^[0-9]*$
Auf die Pattern werde ich in 4. Syntax von Regex näher eingehen. Anmerkung: Es wird empfohlen, bei komplexen Ausdrücken vor dem einleitenden Anführungszeichen des Pattern-Strings ein @-Zeichen zu setzen. Der Präfix @ bewirkt, dass im String vorkommende Anführungszeichen und umgekehrte Schrägstriche (Backslashes) weniger verwirrend angegeben werden können: Anführungszeichen, die im Pattern vorkommen, verdoppelt man, umgekehrte Schrägstriche können normal angegeben werden. Ohne @ müsste man vor einem Anführungszeichen einen umgekehrten Schrägstrich einfügen, umgekehrte Schrägstriche müsste man verdoppeln. (Wenn das Pattern zur Laufzeit definiert wird (z. B. bei Eingabe des Patterns in ein Textfeld während der Programmausführung), so gibt man Anführungszeichen und umgekehrte Schrägstriche normal an.) Die Instanz von Regex wird also folgendermaßen generiert: Regex myRegex = new Regex("^[0-9]*$"); Um zu überprüfen, ob das Suchmuster mit den gegebenen Daten (Inhalt von textBox1) übereinstimmt und anschließend das Ergebnis in eine Bool-Variable zu speichern, wäre folgende Befehlszeile notwendig: bool bedingungWahr = myRegex.IsMatch(textBox1.Text);
Regex check Currency value
The following code example illustrates the use of a regular expression to check whether a string has the correct format to represent a currency value. Note the use of enclosing ^ and $ tokens to indicate that the entire string, not just a substring, must match the regular expression.
#using <System.dll>
using namespace System;
using namespace System::Text::RegularExpressions;
int main()
{
// Define a regular expression for currency values.
Regex^ rx = gcnew Regex( "^-?\\d+(\\.\\d{2})?$" );
// Define some test strings.
array<String^>^tests = {"-42","19.99","0.001","100 USD"};
// Check each test string against the regular expression.
System::Collections::IEnumerator^ myEnum = tests->GetEnumerator();
while ( myEnum->MoveNext() )
{
String^ test = safe_cast<String^>(myEnum->Current);
if ( rx->IsMatch( test ) )
{
Console::WriteLine( "{0} is a currency value.", test );
}
else
{
Console::WriteLine( "{0} is not a currency value.", test );
}
}
}