Home
Über mich
Blog
Veröffentlichungen
IT-Trainings
Impressum


Reguläre Ausdrücke in C#.NET

Allgemeine Informationen zu dem Thema siehe unter dem Kapitel "Reguläre Ausdrücke".

Für die Arbeit mit regulären Ausdrücken steht in .NET der Namespace "System.Text.RegularExpressions" mit leistungsfähigen Klassen zur Verfügung.

Eine dieser Klassen heißt "Regex"; sie besitzt einen dreifach überladenen parametrisierten Konstruktor, der mindestens ein Pattern, optional eine der RegexOptions-Enumerationen und eine Timespan für den Timeout vorgibt.

/// <summary>Prueft einen Stringparameter 
/// auf einen regulaeren Ausdruck</summary>
/// <param name="s">Zu ueberpruefender Wert</param>
/// <param name="pattern">pattern fuer regulaeren Ausdruck</param>
/// <returns>true | false</returns>
public static bool Matches(string s, string pattern)
{
    bool b = false;
    Regex r;
    r = new Regex(pattern);    
    if (r.IsMatch(s)) b = true;
    return b;
}

Im ersten Beispiel soll geprüft werden, ob ein Name mit einem Großbuchstaben beginnt und alle übrigen bis zu einer Gesamtlaenge von 9 Zeichen Kleinbuchstaben sind.

string ss = "Sinnlos";
//Das erste Zeichen muss ein Grossbuchstabe sein, daher ^[A-Z]{1}
string pattern = "^[A-Z]{1}[a-z]{1,9}$";
//auch moeglich: 
//string pattern = "^[A-Z][a-z]{1,9}$";

Der Aufruf ist ebenso unspektakulär ...

if (Matches(ss, pattern)) 
   Console.WriteLine("OK: {0} geprueft gegen {1}", ss, pattern);
else 
   Console.WriteLine("NOT OK");

... wie eindeutig im Ergebnis:

OK: Sinnlos geprueft gegen ^[A-Z][a-z]{1,9}$

Im nächsten Versuch wird eine Postleitzahl geprüft (alle 5 stelligen Zahlen, aber nicht 00000, daher ergibt das Ergebnis "NOT OK"):

ss = "00000";
pattern = "[0-9]{5}(?<!00000)"; 

Auch die Prüfung bestimmter Zahlenformatierungen stellen kein Problem dar:

ss = "123-4567-890";
pattern=@"^\d{3}-\d{4}-\d{3}$";

Über die mit der RegexOptions überladenen Methode stehen erweiterte Möglichkeiten bereit.

public static bool Matches
       (string s, string pattern, RegexOptions option)
{
    bool b = false;
    Regex r;
    r = new Regex(pattern, option);
    if (r.IsMatch(s)) b = true;
    return b;
}

Verfügbar sind die folgenden RegexOptions:

RegexOptions.Compiled
RegexOptions.CultureInvariant
RegexOptions.ECMAScript
RegexOptions.ExplicitCapture
RegexOptions.IgnoreCase
RegexOptions.IgnorePatternWhitespace
RegexOptions.Multiline
RegexOptions.None
RegexOptions.RightToLeft
RegexOptions.Singleline

Eine andere Klasse im Namespace "System.Text.RegularExpressions" ist "MatchCollection". Mit ihr kann eine ganze Liste einzelner "Match"-Objekte generiert und ausgewertet werden:

public static MatchCollection GetMatchCollection
            (string s, string pattern, bool ignorecase)
{
     Regex r;
     if(ignorecase)  
        r = new Regex(pattern, RegexOptions.IgnoreCase);
     else r = new Regex(pattern);
     return r.Matches(s);
}

Übergeben wir die folgenden Parameter, so prüft das Pattern entweder "Sinnlos" oder "Sara" oder "Denzschlos":

string ss = "Ratlos Sinnlos Sinnlos Zwecklos Denzschlos Sinnlos Sara Sinnlos";
string pattern = "(Sinnlos)|(Sara)|([D]{1}[a-z]{1,9})";

... und gibt auch nur diese Werte aus (Ratlos und Zwecklos bleiben außen vor):

    7 : Sinnlos
   15 : Sinnlos
   32 : Denzschlos
   43 : Sinnlos
   51 : Sara
   56 : Sinnlos

Der Aufruf erfolgt auf diese Weise:

IEnumerator e;
e = GetMatchCollection(ss, pattern, true).GetEnumerator();
Match m;
while (e.MoveNext())
{
    m = (Match)e.Current;
    Console.WriteLine("{0,5} : {1}", m.Index, m.Value);
}

Das alternative Pattern checkt direkt aufeinander folgende doppelte Werte ("Sinnlos")

string ss = "Ratlos Sinnlos Sinnlos Zwecklos Zwecklos Sinnlos Sinnlos Sinnlos";
string pattern = @"\b(\w+?)\s\1\b";

und gibt das korrekte Resultat wieder:

    7 : Sinnlos Sinnlos
   23 : Zwecklos Zwecklos
   41 : Sinnlos Sinnlos

qrpic/regexpr1.jpg

wg / 3. Oktober 2017




Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf (info10@wilfried-grupe.de).



Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

Mobil: 0151. 750 360 61 * eMail: info10@wilfried-grupe.de