Theoretische Informatik

Reguläre Ausdrücke in Programmiersprachen

Wie wir gesehen haben, ist ein regulärer Ausdruck ein gemeinsames Muster, nach dem alle Wörter einer bestimmten Menge von Wörtern aufgebaut sind. In Programmier­sprachen steht die Nutzung von regulären Ausdrücken zur Verfügung, um Benutzer­eingaben auf zulässige Form zu prüfen (z.B. eine E-Mail-Adresse) oder um "unscharfe" Suchvorgänge in Texten zu vereinfachen, also Suchvorgänge, bei denen die gesuchte Zeichenfolge nur ungefähr bekannt ist (z.B. der Name Meier in unterschiedlichen Schreib­weisen).

In den Programmier­sprachen PHP und JavaScript wird für reguläre Ausdrücke weitgehend dieselbe Notation wie in der theoretischen Informatik verwendet. Zusätzlich gibt es noch eine Reihe von Ergänzungen, die sich als praktisch erweisen.

Beispiel

In der Programmier­sprache PHP sind ganzzahlige dezimale Zahlen­konstanten wie beispiels­weise -17 nach folgendem Muster aufgebaut: Als erstes kann ein Vorzeichen kommen, und dann kommt eine nichtleere Ziffernfolge, die jedoch nicht mit einer Null beginnt, wenn danach noch Ziffern ungleich Null kommen (denn sonst wird die Zahl als Oktalzahl inter­pretiert).

Der reguläre Ausdruck, der in PHP dieses Muster beschreibt, lautet wie folgt:

(\+|-)?(0+|[1-9][0-9]*)

Zulässig als dezimale Zahlen­konstanten sind somit etwa

23+23-2390-00002000365.

Nicht zulässig sind dagegen beispiels­weise

007 (führende Null), --3 (mehr als ein Vorzeichen), + 3 (Leerzeichen).

Die genaue Syntax regulärer Ausdrücke in PHP wird im Folgenden erklärt; danach erschließt sich die Zusammen­setzung des angegebenen regulären Beispiel-Ausdrucks.

Alphabetzeichen und Metazeichen

Reguläre Ausdrücke enthalten Alphabet­zeichen und Metazeichen. Alphabet­zeichen sind diejenigen Zeichen, aus denen die Wörter bestehen, die durch den regulären Ausdruck erzeugt werden. Metazeichen sind diejenigen Zeichen, die darüber hinaus zur Darstellung des regulären Ausdrucks benötigt werden.

Die in obigem Ausdruck vorkommenden Metazeichen haben folgende Bedeutung

| Alternative
* optionale Wiederholung
? Option
+ Wiederholung
( ) Gruppierung
\ Aufhebung des Metazeichen­status
[ ] Zeichenmenge

Das Zeichen - ist innerhalb von eckigen Klammern ein Metazeichen und bedeutet "bis", wenn es zwischen zwei Alphabet­zeichen steht.

Zeichenmengen

Eine Zeichenmenge besteht aus einer Aneinander­reihung von Zeichen zwischen zwei eckigen Klammern. Beispiels­weise ist [abc] eine solche Zeichenmenge; sie steht als Kurzform für den regulären Ausdruck a|b|c. Mengen von alphabetisch aufeinander­folgenden Zeichen lassen sich noch kürzer durch Verwendung des Zeichens - darstellen; beispiels­weise steht [a-c] für [abc]. Im obigen Beispiel wurde unter anderem die Zeichenmenge [0-9] verwendet.

Andere Beispiele sind [a-zA-ZäöüßÄÖÜ] für alle Klein- und Groß­buchstaben einschließ­lich Umlauten oder [+-] für die Zeichen + und -. Das Zeichen + ist innerhalb einer Zeichenmenge kein Metazeichen, daher wird kein voran­gestellter \ benötigt. Das Zeichen - ist innerhalb von eckigen Klammern nur dann ein Metazeichen, wenn es zwischen zwei Alphabet­zeichen steht, wie z.B. in [0-9].

Die Menge aller Zeichen wird durch das Metazeichen . dargestellt (ohne eckige Klammern). Der reguläre Ausdruck .+ steht also für eine nichtleere Folge von beliebigen Zeichen.

Eine Besonderheit stellt die Verwendung des Zeichens ^ in Zeichen­mengen dar. Es ist hier ein Metazeichen und bedeutet "nicht". Die Zeichenmenge [^abc] stellt das Komplement der Zeichenmenge [abc] innerhalb der Menge aller Zeichen dar. Sie steht also für ein beliebiges Zeichen außer a, b und c.

Auswertung

In dem regulären Ausdruck aus dem Beispiel wird das optionale Vorzeichen durch den Teilausdruck (\+|-)? dargestellt. Ein Vorzeichen ist also ein Pluszeichen oder ein Minuszeichen. Durch das Fragezeichen wird ausgedrückt, dass das Vorzeichen optional ist, d.h. dass es auch fehlen kann. Die runden Klammern machen deutlich, auf welchen Ausdruck sich das Fragezeichen bezieht. Das Zeichen \ vor dem Pluszeichen bewirkt, dass das Pluszeichen hier als Alphabet­zeichen und nicht als Metazeichen inter­pretiert wird. Eine alternative Darstellung dieses Teil­ausdrucks ist [+-]?.

Nach dem optionalen Vorzeichen kommt entweder eine nichtleere Folge von Nullen (dargestellt durch den Ausdruck 0+), oder eine der Ziffern von 1 bis 9 (dargestellt durch die Zeichenmenge [1-9]) gefolgt von einer möglicher­weise auch leeren Folge von weiteren Ziffern aus dem Bereich von 0 bis 9 (dargestellt durch [0-9]*). Die Gruppierung dieser beiden Alternativen durch runde Klammern ist notwendig, da in regulären Ausdrücken "gefolgt von" stärker bindet als |.

Leerzeichen werden in regulären Ausdrücken in PHP nicht ignoriert, sondern als Alphabet­zeichen behandelt. Da in den Zahlen­konstanten keine Leerzeichen auf­treten, kommen im entsprechenden regulären Ausdruck keine Leerzeichen vor.

Weitere Möglichkeiten

Es wurden hier nur die wichtigsten Möglich­keiten zur Darstellung von regulären Ausdrücken in PHP beschrieben – im Wesentlichen diejenigen, die eine Entsprechung in der theoretischen Informatik haben. Darüber hinaus gibt es in PHP noch eine ganze Reihe von weiteren Möglich­keiten, die teils sinnvoll, teils in ihrer Fülle auch verwirrend sind.

PHP-Testprogramm

Folgendes PHP-Programm testet, ob ein bestimmtes Eingabewort von einem bestimmten regulären Ausdruck erzeugt wird.

 

<?php
if (!isset($_POST['submitregexpr']))
{
    $pat="(\\+|-)?(0+|[1-9][0-9]*)";
    $txt="+000";
    $res="";
}
else
{
    $pat=$_POST['regexpr'];
    $txt=$_POST['inputword'];
    $pattern="/($pat)$/";
    $res=preg_match($pattern, $txt);
}

echo "<form method=\"post\">\n";
echo "<p>Regulärer Ausdruck: ";
echo "<input name=\"regexpr\" type=\"text\" value=\"$pat\"></p>\n";
echo "<p>Eingabewort: ";
echo "<input name=\"inputword\" type=\"text\" value=\"$txt\"></p>\n";
echo "<p><input name=\"submitregexpr\" type=\"submit\" "
echo "value=\"Prüfen\"></p>\n";
echo "</form>\n";

echo "<p>$res</p>\n";
?>

 

 

Das Testprogramm gibt eine 1 aus, wenn das Eingabewort von dem regulären Ausdruck erzeugt wird, und sonst eine 0. Wird nichts ausgegeben, enthält der reguläre Ausdruck einen Fehler.

Die hier benutzte PHP-Funktion preg_match prüft normaler­weise, ob irgendwo im Eingabewort ein Teilwort vorkommt, das von dem regulären Ausdruck erzeugt wird. Um zu prüfen, ob das ganze Eingabewort von dem regulären Ausdruck erzeugt wird, wird dem regulären Ausdruck noch das Zeichen (für Wortanfang) voran­gestellt und das Zeichen $ (für Wortende) nachgestellt. Das Zeichen / stellt ein Begrenzungs­zeichen für den regulären Ausdruck dar.

JavaScript-Testprogramm

Das folgende JavaScript-Programm testet, ob ein bestimmtes Eingabewort von einem bestimmten regulären Ausdruck erzeugt wird.

 

<html>
<head>
<title>Reguläre Ausdrücke testen</title>
<script type="text/javascript">
function main()
{
    var regexpr=new RegExp("^"+document.eingabeformular.textbox1.value+"$");
    var inputstring=document.eingabeformular.textbox2.value;
    if (regexpr.exec(inputstring))
        alert("ok");
    else
        alert("not ok");
}
</script>
</head>

<body>
<h2>Reguläre Ausdrücke testen</h2>
<form name="eingabeformular">
<p>Regulärer Ausdruck:
<input type="text" name="textbox1" size="40"
value="(\+|-)?(0+|[1-9][0-9]*)">
</p>
<p>Eingabewort:
<input type="text" name="textbox2" size="20" value="+000"></p>
<p><input type="button" onClick="main();" value="Prüfen"></p>
</form>
</body>
</html>

 

 

Auch hier wird der im Textfeld eingegebene reguläre Ausdruck wieder in die Zeichen ^ (für Wortanfang) und $ (für Wortende) ein­geschlossen, damit geprüft wird, ob das gesamte Eingabewort von dem regulären Ausdruck erzeugt wird.

 

Zurück zu:   [Reguläre Ausdruck, reguläre Sprache]   oder   [up]

 


H.W. Lang   mail@hwlang.de   Impressum   Datenschutz
Created: 08.10.2011   Updated: 17.02.2023
Diese Webseiten sind während meiner Lehrtätigkeit an der Hochschule Flensburg entstanden