Reguläre Ausdrücke in C#

Reguläre Ausdrücke sind ein mächtiges Programmierwerkzeug, doch die meisten Entwickler die ich kenne, benutzen diese ungern, da die Syntax doch sehr kryptisch ist. Ich benutze die RegEx-Klasse immer häufiger und deshalb werde hier einfach einmal ein kleines Tutorial, ohne den Anspruch der Vollständigkeit vorstellen.

Aufbau von Regulären Ausdrücken

Reguläre Ausdrücke werden in Zeichen, Zeichenklassen und Metazeichen unterteilt.

Jedes normale Zeichen steht für sich selbst, das heißt, dass der Ausdruck xy auf alle Zeichenketten passt, in denen xy vorkommt, wie z.B. in Proxy.

Zeichenklassen werden in eckigen Klammern definiert.

– [a-z] steht für einen beliebigen Buchstaben, der zwischen a und z vorkommt

– [abcxy] steht für einen der Buchstaben a,b,c,x,y

. Alle Zeichen außer \n .a
^ Anfang einer Zeichenkette ^z
$ Ende einer Zeichenkette w$
| Alternativen a|b
( ) Zusammenfassen von Teilen (ab)|c
[ ] Erstellung von Zeichenklassen [jhklWZ]
{ } Quantifizierer a{2}
\ Maskierung von Zeichen
\b , \B \b Leere Zeichenkette am Wortanfang oder am Wortende
\B Leere Zeichenkette nicht am Ende oder Anfang
\s , \S \s Whitespace
\S Non- Whitespace
\d , \D \d alle Ziffern
\D alle Zeichen außer Ziffern
\w , \W \w alle Wortzeichen
\W alle Nicht-Wortzeichen
\n Zeilenumbruch
\t Tabulator
\r Carriage Return
\xYY definiert das Zeichen mit hexadezimalem Zeichencode YY
\YYY steht für das Zeichen mit oktalen Zeichencode YYY

Metazeichen verändern die Bedeutung von normalen Zeichen
Steht ^ am Anfang einer Zeichenmenge, so wird diese Menge negiert
– definiert einen Bereich in Zeichenmengen.

Quantifier

Quantifier geben die maximale, minimale oder genaue Anzahl von Wiederholungen an und beziehen sich auf den direkt vorher stehenden Ausdruck.
Quantifier dienen dabei der Abkürzung der Schreibweise.

* Allquantor, Vorkommen des Zeichens beliebig oft a*
+ Existenzquantor, Ausdruck kommt mindestens einmal vor a+
? Genau einmal oder kein Vorkommen ab?a
{n} Genau n- maliges Vorkommen a{5}
{n,} Mindestens n- maliges Vorkommen a{2,}
{,m} Maximal m- maliges Vorkommen a{,3}
{n,m} Mindestens n- maliges, maximal m- maliges Vorkommen a{1,6}

Quantifier versuchen auf die größtmögliche Zeichenfolge zu passen, das heißt dass der Ausdruck

(.b)* in absbgbhb
nur einmal gefunden wird.

Die Abhilfe dafür ist: (.b)*?
Damit wird nur der kürzeste passende Teilstring gefunden und liefert:
ab, sb, gb, hb als Ergebnis zurück.

Modifier

Werden verwendet um das Matchingverhalten zu verändern.
Optionale Parameter können bei der Erstellung einer Instanz von Regex angegeben werden, alternativ auch am Ende des regulären Ausdruckes.

i case- insensitive Auswertung, Groß- und Kleinschreibung wird nicht beachtet
m Multiline, ^ und $ beziehen sich auf Beginn und Ende einer Zeile (anstatt auf die Zeichenkette)
s Singleline, “.“ bezieht sich auf alle Zeichen (anstatt auf alle außer \n)

Namespace System.Text.RegularExpressions

Der Namespace System.Text.RegularExpressions besteht aus folgenden Klassen:

– RegEx

– Capture/CaptureCollection

– Group/GroupCollection

– Match/MatchCollection

– RegexCompilationInfo

Und außerdem noch:

– Enumeration RegexOptions

– Delegate MatchEvaluator

RegEx dient zum Erzeugen und zum Überprüfen von regulären Ausdrücken.

Methoden:

IsMatch(strString) liefert true/false
Match(strString) liefert ein Match
Matches(strString) liefert eine MatchCollection
Replace(erster, zweiter) ersetzt Vorkommen von erster durch zweiter
Split(strString) trennt strString zwischen den Fundstellen des regulären Ausdrucks

Beispiele

Beispiel zur Erzeugung

 public bool RegexBeispiel() {
	  //Teststring erzeugen
	  string myString ="lalala";
	  //regulären Ausdruck erstellen
	  Regex r = new Regex("(la)+");
	  //Teststring überprüfen
	  return r.IsMatch(myString);
}

Beispiele für Replace:

  //Wandelt alle a in A um
  public string nurGrosseA(string input) {
	  return Regex.Replace(input,"a","A");
  }

  //Entfernt alle Buchstaben aus den Inputstring und
  //lässt nur Zahlen über.
  public string nurZahlen(string input) {
	  return Regex.Replace(input, [a-z],"");
  }

Beispiel für MatchCollection

  //Neues Objekt erzeugen
  Regex r = new Regex("abc");
  //Ein Match suchen
  MatchCollection mc = r.Matches("123abc456abcd");
  //Wenn ein Match gefunden wurde, dann Details ausgeben
  for (int i=0; i < mc.Count; i++){
	  Console.WriteLine("Treffer an Position: " + mc[i].Index);
	  Console.WriteLine("Gefunden wurde: " + mc[i].Value);
  }

Ausgabe:

	Treffer an Position: 3
	Gefunden wurde: abc
	Treffer an Position: 9
	Gefunden wurde: abc

Beispiel zum überprüfen einer eMail-Adresse

  public bool IsEmail(string email){
    string pattern = @"^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|" +
			  "([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*" +
			  "[A-Za-z0-9\.]+@((\w+\-+)|(\w+\.))*" +
			  "\w{1,63}\.[a-zA-Z]{2,6}$";
    Regex RegEx = new Regex(pattern);

    return RegEx.IsMatch(email);
}

Hinweis:
Der Ausdruck [A-Za-z0-9] ist die Kurzschreibweise für [A-Z][a-z][0-9]

Update 01.12.2009

Der Kosmonaut hat das Tool Regulator (http://sourceforge.net/projects/regulator/) ja bereits in einem Kommentar empfohlen.
Ich habe jetzt ein weiteres Werkzeug zum interaktiven Erstellen von regulären Ausdrücken entdeckt: Regulazy

RegulazyDemo

http://tools.osherove.com/Regulazy/tabid/182/Default.aspx