XPath 3.0, XPath 2.0, XPath 1.0 / XPath-Funktionen / Stringfunktionen / Reguläre Ausdrücke in C#.NET

Reguläre Ausdrücke in C#.NET

Reguläre Ausdrücke in C#.NET

➪ Reguläre Ausdrücke sind eine zwar kryptische, aber mächtige Möglichkeit zur Stringverarbeitung.

Allgemeine Informationen zu dem Thema siehe in Kapitel .

Für die Arbeit mit regulären Ausdrücken steht in C#.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 = new Regex(pattern);    
    if (r.IsMatch(s)) b = true;
    return b;
}

Im ersten Beispiel soll geprüft werden, ob eine Zeichenkette 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üfungen 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 = 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 Sie 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();
while (e.MoveNext())
{
    Match m = (Match)e.Current;
    Console.WriteLine("{0,5} : {1}", m.Index, m.Value);
}

Das alternative Pattern checkt direkt aufeinanderfolgende 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

wg / 13. April 2018



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.


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

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

www.wilfried-grupe.de/regexpr1.html