Benutzer:Sacaldur/Gruene Wiese

Aus Spieleprogrammierer-Wiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
(Aufbau eines Regulären Ausdrucks)
(Beispiele)
Zeile 186: Zeile 186:
 
== Beispiele ==
 
== Beispiele ==
  
folgende Beispiele sollen noch einige Kombinationsmöglichkeiten zeigen:
+
Im folgenden sind einige Beispiele für mögliche reguläre Ausdrücke aufgeführt, die die Kombinationsmöglichkeiten der verschiedenen Elemente eines regulären Ausdrucks demonstrieren sollen.
trifft bei beliebig vielen Ziffern zu:
+
 
<code>\d*</code>
+
 
trifft bei einer 3 stelligen Ziffernfolge am Ende der Zeichenkette zu:
+
<code>\d*</code>
<code>\d{3}$</code>
+
Dieser reguläre Ausdruck Trifft bei beliebig vielen Ziffern zu. Es handelt sich um eine sehr einfache Kombination eines Platzhalters mit einem Quantor. Wie man in der entsprechenden Übersicht sehen kann, repräsentiert <code>\d</code> eine beliebige Ziffer. Durch den <code>*</code> wird, wie in entsprechender Übersicht zu sehen, angegeben, dass dieses Zeichen beliebig oft vorkommen kann. Ein solcher regulärer Ausdruck wäre in der Praxis irelevant, da er immer zutreffen würde.
trifft bei einer Zeichenkette ohne Punkte zu:
+
 
<code>^[^\.]*$</code>
+
 
trifft bei einer gültigen Ganzzahl zu (ohne Tausendertrennzeichen):
+
<code>\d{3}$</code>
<code>^([-+]?[1-9]\d*|0)$</code>
+
Bei diesem Beispiel müssen am Ende der Zeichenkette genau 3 Ziffern stehen. Dass es Ziffern sein müssen, gibt das <code>\d</code> an, dass es exakt 3 sein müssen, gibt das <code>{3}</code> an und dass sie am Ende stehen müssen gibt das <code>$</code> an, da sich dieses am Ende befindet.
trifft bei einer gültigen Zahl (Ganzzahl oder Festkommazahl) zu (ohne Tausendertrennzeichen, Komma oder Punkt als Dezimaltrennzeichen):
+
 
<code>^([-+]?[1-9]\d*|0)([,\.]\d+)?$</code>
+
 
 +
<code>^[^\.]*$</code>
 +
Dieser reguläre Ausdruck kann verwendet werden, wenn sich in einer Zeichenkette keine Punkte befinden dürfen. <code>^</code> und <code>$</code> geben an, dass die gesamte Zeichenkette aus den dazwischen stehenden Symbolen bestehen muss. <code>\.</code> hebt die Wirkung des <code>.</code> auf, wodurch er an dieser Stelle als normaler Punkt dient. das <code>^</code> am Anfang der Eckigen Klammern negiert den Ausdruck, wodurch alle Zeichen gültig sind, abgesehen von den angegebenen, in dem Fall abgesehen von Punkten. Der Stern gibt an, dass diese Zeichen beliebig oft vorkommen dürfen. Dieses Beispiel ist aber nicht die einfachste Lösung für das Problem. Effizienter wäre es, zu überprüfen, ob sich in der Zeichenkette überhaupt Punkte befinden, was mit einem wesentlich einfacheren Ausdruck möglich ist.
 +
<code>\.+</code>
 +
Die Prüfung nach einzelnen Zeichen lässt sich teilweise viel schneller mit anderen Zeichenketten-Operationen durchführen. Sinn macht deswegen eine solche Prüfung eher, wenn mehrere verschiedene Zeichen nicht vorkommen dürfen und deswegen deren Vorhandensein geprüft werden muss.
 +
 
 +
 
 +
<code>^([-+]?[1-9]\d*|0)$</code>
 +
Mit diesem bereits sehr komplexen Ausdruck kann überprüft werden, ob es sich bei der Zeichenkette um eine gültige Ganzzahl (ohne Tausendertrennzeichen) handelt. <code>^</code> und <code>$</code> bestimmen Anfang und Ende. In den runden Klammern befindet sich ein <code>|</code>, welches den Inhalt der Klammern in 2 Teile teilt. Die <code>0</code> ist ein normales Zeichenliteral und somit ist die einzige damit gültige Kombination eine <code>0</code>. Die Andere Seite beginnt mit der Zeichenklasse <code>[-+]?</code>. Es darf ein - oder ein + einmal oder gar nicht vorhanden sein. Danach folgt die Zeichenklasse <code>1-9</code>, welche alle Ziffern abgesehen von 0 zulässt. Dadurch wird sicher gestellt, dass die erste Ziffer keine 0 ist und somit werden führende Nullen vermieden. <code>\d*</code> steht für eine beliebige Anzahl weiterer Ziffern.
 +
 
 +
 
 +
<code>^([-+]?[1-9]\d*|0)([,\.]\d+)?$</code>
 +
Dieses Beispiel ermöglicht im Gegensatz zum letzten Beispiel zusätzlich Festkommezahlen. Dazu erweitert es das obere Beispiel um die Gruppierung <code>([,\.]\d+)?</code> auf der rechten Seite. Sie beginntmit der Zeichenklasse <code>[,\.]</code>, wodurch am Anfang der Gruppe ein Punkt oder ein Komma stehen muss. danach folgt mindestens 1 bis beliebig viele Ziffern. Durch das <code>?</code> kann der gesamte Teil 1 Mal vorhanden sein oder entfallen.
 +
 
 +
 
 +
<code>^\d{3}\.\d{3}\.\d{3}\.\d{3}$</code>
 +
Dieser reguläre Ausdruck kann verwendet werden, um zu prüfen, ob es sich bei einer Zeichenkette um eine IPv4-Adresse handelt. Allerdings sind auch ungültige Adressen möglich, wie ''342.68.001.3''.
 +
<code>^(0|[1-9]\d?|1\d{2}|2[0-4]\d|25[0-5])\.(0|[1-9]\d?|1\d{2}|2[0-4]\d|25[0-5])\.(0|[1-9]\d?|1\d{2}|2[0-4]\d|25[0-5])\.(0|[1-9]\d?|1\d{2}|2[0-4]\d|25[0-5])$</code>
 +
Dieser reguläre Ausdruck hingegen prüft exakt, ob es sich um eine gültige IPv4 Adresse handelt. Der enorme Anstieg der Komplexität dürfte offensichtlich sein. Entsprechend rechenintensiv ist der Ausdruck bei einer Überprüfung im Gegensatz zu dem oberen, ungenauen Beispiel. Da die Bibliotheken für Netzwerkkommunikation in der Regel eine derartige Prüfung bereits mitliefern, die grundsätzlich schneller sein könnte, empfiehlt es sich, auf diese zurück zu greifen.
 +
 
 +
 
 +
Ein praktikableres Beispiel wäre es, wenn in einem Spiel die Wahl des Namens einen Einfluss auf das Spielgeschehen hat. so könnte ein Name, der mit einem Buchtaben von A bis L beginnt andere folgen haben, als einer, der mit einem Buchstaben von M bis X beginnt.
 +
<code>^[a-lA-L]</code>
 +
<code>^[m-xM-X]</code>
 +
Alternativ könnte im Quellcode des Spiel eine Fallunterscheidung vorgenommen werden, die in der Regel aber zu schwerer lesbarem Code führen würde.
  
  

Version vom 4. November 2011, 09:28 Uhr

Auf dieser Seite werde ich meine Artikel vorbereiten. Da sich diese in meinem Benutzernamensraum befindet, ist der vorhandene Inhalt nicht als Vollständig und nicht als Teil des Wikis anzusehen.

Inhaltsverzeichnis

Tabellentest

geklaut von Wikipedia

Abk. Land Landeshauptstadt Fläche (km²) Einwohner Einwohner/km²
BW Baden-Würtemberg Stuttgart 35.752 ein paar ein paar
BY Bayern München 70.552 einige einige
BE Berlin 892 viele viele
Bundesrepublik Deutschland groß viele yyyy

minimalistisch

1 2 3
A A1 A2 A3
B B1 B2 B3
C C1 C2 C3

Tutorial: Reguläre Ausdrücke

Folgende kurze Anleitung habe ich bereits in einem Forum geschrieben und werde sie für das Wiki anpassen.

Reguläre Ausdrücke stellen ein weit verbreitetes Instrument zur Analyse von Zeichenketten dar. Mit ihnen lassen sich Zeichenketten auf bestimmte Inhalte Überprüfen oder Ersetzungen vornehmen. So ließe sich mit ihnen die Gültigkeit einer Eingabe, beispielsweise einer E-Mail Adresse oder einer IP-Adresse überprüfen.

Aufbau eines Regulären Ausdrucks

Die Bestandteile, aus denen ein regulärer Ausdruck bestehen kann, kann man in wenige Gruppen einteilen.

Zeichenliterale

Zeichen, die keine besondere Bedeutung haben, müssen genauso wie sie angegeben wurden auch in der Zeichenkette vorkommen. Zu diesen gehören beispielsweise die Buchstaben (von A bis Z in großer und kleiner Schreibweise) oder die Zahlen (0 bis 9).

Folgendes würde zutreffen, wenn abc enthalten ist:

abc

Platzhalter

Platzhalter symbolisieren das Vorhandensein eines anderen Zeichens. Nachfolgend eine Liste einiger Platzhalter. Der Slash (\) stellt in diesem Zusammenhang das Escape Zeichen dar, welches dem folgenden Zeichen eine andere Bedeutung gibt. Zeichen, die im Normalen Zusammenhang eine besondere Bedeutung haben, können mit Hilfe eines voran gestellten Slash dargestellt werden.

Nachfolgende eine Auflistung von wichtigen Platzhaltern.

Symbol Bedeutung
. beliebiges Zeichen
\d Ziffer
\D alles abgesehen von Ziffern
\w Buchstabe (in der englischen Sprache, Umlaute zählen nicht als Buchstaben)
\W alles abgesehen von Buchstaben (englische Sprache)

Folgendes würde zutreffen, wenn eine Zahl, gefolgt von einem Buchstaben, gefolgt von abc enthalten ist:

\d\wabc

Anfang/Ende

Es gibt Symbole, die den Anfang und das Ende einer Zeichenkette darstellen und mit denen sich festlegen kann, dass ein bestimmter Inhalt am Anfang oder Ende stehen soll.

Symbol Bedeutung
^ Anfang, wenn erstes Zeichen
$ Ende, wenn letztes Zeichen

Folgendes trifft zu, wenn abc am Anfang steht:

^abc

Oder

Beim Oder, welches durch einen senkrechten Strich (|), auch Pipe genannt, dargestellt wird, muss nur der Ausdruck davor oder dahinter zutreffend sein.

Folgendes würde zutreffen, wenn abc oder eine Zahlen enthalten ist:

abc|\d

Gruppierung (Runde Klammern)

Runde Klammern gruppieren Zeichen. In neueren Implementierungen wird ein Vorkommen einer solche Gruppen gespeichert und kann für Ersetzungen verwendet werden. in den meisten Fällen wird \n oder $n verwendet, um auf die einzelnen Gruppen und somit auf die Treffer zuzugreifen, damit diese ersetzt werden können.

Folgendes würde zutreffen, wenn nach einer Zahl eine Zahl oder ein abc steht:

\d(\d|abc)

Zeichenauswahl (Eckige Klammern)

Aus den in eckigen Klammern angegebenen Zeichenliteralen oder Platzhaltern muss nur 1 Zeichen oder Platzhalter zutreffend sein.

Folgende Zeichen stellen eine Besonderheit dar:

Symbol Bedeutung
- wird für Reihen von Zeichen verwendet, wie 2-4 für 2, 3 oder 4 oder c-f für c, d, e oder f, und stellt nur am Anfang ein - dar
^ negiert den Ausdruck, sofern es am Anfang steht
runde und geschweifte Klammern stellen runde oder geschweifte Klammern dar

Folgendes trifft bei 1 alphanumerischem Zeichen zu:

[0-9a-zA-Z]

Quantoren (Mengenangabe)

Quantoren sind Symbole zur Bestimmung der Häufigkeit. Sie stehen immer direkt hinter einem Zeichenliteral, einem Platzhalter, einer Zeichenklasse oder einer Gruppierung und geben für diesen die Häufigkeit an.

Symbol Bedeutung (Anzahl der Vorkommnisse)
? 0 oder 1
* 0 bis beliebig
+ 1 bis beliebig
{n} exakt n (natürliche Zahl)
{min,} mindestens min (natürliche Zahl)
{min, max} min (natürliche Zahl) bis max (natürliche Zahl)

Beispiele

Im folgenden sind einige Beispiele für mögliche reguläre Ausdrücke aufgeführt, die die Kombinationsmöglichkeiten der verschiedenen Elemente eines regulären Ausdrucks demonstrieren sollen.


\d*

Dieser reguläre Ausdruck Trifft bei beliebig vielen Ziffern zu. Es handelt sich um eine sehr einfache Kombination eines Platzhalters mit einem Quantor. Wie man in der entsprechenden Übersicht sehen kann, repräsentiert \d eine beliebige Ziffer. Durch den * wird, wie in entsprechender Übersicht zu sehen, angegeben, dass dieses Zeichen beliebig oft vorkommen kann. Ein solcher regulärer Ausdruck wäre in der Praxis irelevant, da er immer zutreffen würde.


\d{3}$

Bei diesem Beispiel müssen am Ende der Zeichenkette genau 3 Ziffern stehen. Dass es Ziffern sein müssen, gibt das \d an, dass es exakt 3 sein müssen, gibt das {3} an und dass sie am Ende stehen müssen gibt das $ an, da sich dieses am Ende befindet.


^[^\.]*$

Dieser reguläre Ausdruck kann verwendet werden, wenn sich in einer Zeichenkette keine Punkte befinden dürfen. ^ und $ geben an, dass die gesamte Zeichenkette aus den dazwischen stehenden Symbolen bestehen muss. \. hebt die Wirkung des . auf, wodurch er an dieser Stelle als normaler Punkt dient. das ^ am Anfang der Eckigen Klammern negiert den Ausdruck, wodurch alle Zeichen gültig sind, abgesehen von den angegebenen, in dem Fall abgesehen von Punkten. Der Stern gibt an, dass diese Zeichen beliebig oft vorkommen dürfen. Dieses Beispiel ist aber nicht die einfachste Lösung für das Problem. Effizienter wäre es, zu überprüfen, ob sich in der Zeichenkette überhaupt Punkte befinden, was mit einem wesentlich einfacheren Ausdruck möglich ist.

\.+

Die Prüfung nach einzelnen Zeichen lässt sich teilweise viel schneller mit anderen Zeichenketten-Operationen durchführen. Sinn macht deswegen eine solche Prüfung eher, wenn mehrere verschiedene Zeichen nicht vorkommen dürfen und deswegen deren Vorhandensein geprüft werden muss.


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

Mit diesem bereits sehr komplexen Ausdruck kann überprüft werden, ob es sich bei der Zeichenkette um eine gültige Ganzzahl (ohne Tausendertrennzeichen) handelt. ^ und $ bestimmen Anfang und Ende. In den runden Klammern befindet sich ein |, welches den Inhalt der Klammern in 2 Teile teilt. Die 0 ist ein normales Zeichenliteral und somit ist die einzige damit gültige Kombination eine 0. Die Andere Seite beginnt mit der Zeichenklasse [-+]?. Es darf ein - oder ein + einmal oder gar nicht vorhanden sein. Danach folgt die Zeichenklasse 1-9, welche alle Ziffern abgesehen von 0 zulässt. Dadurch wird sicher gestellt, dass die erste Ziffer keine 0 ist und somit werden führende Nullen vermieden. \d* steht für eine beliebige Anzahl weiterer Ziffern.


^([-+]?[1-9]\d*|0)([,\.]\d+)?$

Dieses Beispiel ermöglicht im Gegensatz zum letzten Beispiel zusätzlich Festkommezahlen. Dazu erweitert es das obere Beispiel um die Gruppierung ([,\.]\d+)? auf der rechten Seite. Sie beginntmit der Zeichenklasse [,\.], wodurch am Anfang der Gruppe ein Punkt oder ein Komma stehen muss. danach folgt mindestens 1 bis beliebig viele Ziffern. Durch das ? kann der gesamte Teil 1 Mal vorhanden sein oder entfallen.


^\d{3}\.\d{3}\.\d{3}\.\d{3}$

Dieser reguläre Ausdruck kann verwendet werden, um zu prüfen, ob es sich bei einer Zeichenkette um eine IPv4-Adresse handelt. Allerdings sind auch ungültige Adressen möglich, wie 342.68.001.3.

^(0|[1-9]\d?|1\d{2}|2[0-4]\d|25[0-5])\.(0|[1-9]\d?|1\d{2}|2[0-4]\d|25[0-5])\.(0|[1-9]\d?|1\d{2}|2[0-4]\d|25[0-5])\.(0|[1-9]\d?|1\d{2}|2[0-4]\d|25[0-5])$

Dieser reguläre Ausdruck hingegen prüft exakt, ob es sich um eine gültige IPv4 Adresse handelt. Der enorme Anstieg der Komplexität dürfte offensichtlich sein. Entsprechend rechenintensiv ist der Ausdruck bei einer Überprüfung im Gegensatz zu dem oberen, ungenauen Beispiel. Da die Bibliotheken für Netzwerkkommunikation in der Regel eine derartige Prüfung bereits mitliefern, die grundsätzlich schneller sein könnte, empfiehlt es sich, auf diese zurück zu greifen.


Ein praktikableres Beispiel wäre es, wenn in einem Spiel die Wahl des Namens einen Einfluss auf das Spielgeschehen hat. so könnte ein Name, der mit einem Buchtaben von A bis L beginnt andere folgen haben, als einer, der mit einem Buchstaben von M bis X beginnt.

^[a-lA-L]
^[m-xM-X]

Alternativ könnte im Quellcode des Spiel eine Fallunterscheidung vorgenommen werden, die in der Regel aber zu schwerer lesbarem Code führen würde.


nachdem man jetzt alles wichtige über die regulären Ausdrücke weiß, kann man diese auch auf verschiedene Arten einsetzen in der Regel kann man eine Zeichenkette auf Übereinstimmung mit einem regulären Ausdruck prüfen oder eine Ersetzung vornehmen bei den Ersetzungen stellen die runden Klammern eine Besonderheit dar, da man deren Treffer auswerten kann dazu wird ein $, gefolgt von der Nummer des Klammernpaares, beginnend mit 1, verwendet

Meine Werkzeuge
Namensräume
Varianten
Aktionen
Navigation
Werkzeuge