Hi comm und Leute von außerhalb des Forums,
-> Dieses Tutorial richtet sich an blutige Anfänger und alle die bereits schon Erfahrungen mit RegEx haben<-
RegEx braucht man einfach so gut wie immer wenn man professionell mit Strings arbeiten möchte.
-> Dieses Tutorial richtet sich an blutige Anfänger und alle die bereits schon Erfahrungen mit RegEx haben<-
RegEx braucht man einfach so gut wie immer wenn man professionell mit Strings arbeiten möchte.
Was durchgenommen wird
- Einführung (was ist RegEx, wofür ist es gut)
- Erklärung der verschiedenen Zeichen
- Escapen (was bewirkt es, was bedeutet escapen)
- Code Snippets (Code-Schnippsel)
- Ersetzungen (
?<X>expr
<->${X}
) - Beispielprojekt zum ausprobieren in Visual Basic
Bevor wir anfangen können, müssen einige wenige Vorbereitungen getroffen werden:
- Visual Basic muss installiert sein, davon ausgehend, dass Sie Ihr neu erworbenes Wissen direkt in die Tat umsetzen möchten
- Zeit und Lust
- Lernbereitschaft, selbsterklärend
- und das wichtigste, die Klasse System.Text.RegularExpressions muss importiert werden (wie bei allen imports-Anweisungen ganz oben im Code).
So wird's gemacht:
Kurz ein Wort zur Ersetzung.
Moment mal, wieso brauchen wir dafür RegEx? VB stellt uns doch bereits ein eine Ersetzen-Funktion (Replace) zur Verfügung. Allgemein bekannt sieht das dann in etwa so aus:
Da wir das bereits kennen, ist nun die Frage, wozu wir zum Ersetzen noch RegEx brauchen. Das ist schnell erklärt, und jeder kennt die Situation: Manchmal möchte man nur bestimmte Muster eines Textes ersetzen, z.B. nur Wörter die mit "a" beginnen, oder nur Zahlen ersetzen, oder einfach nur alles ersetzen was zwischen zwei "" steht. Und das ist etwas, was mit der normalen Replace Funktion nur sehr schwer, und bis zu einem gewissen Grad teilweise gar nicht mehr zu bewerkstelligen ist. Zu Replace gleich noch Beispiele, zuerst wollen wir uns jedoch die alles entscheidende Kernfrage stellen, die da lautet ...
Was ist denn nun RegEx?
RegEx steht für "Regular Expressions", zu Deutsch "Reguläre Ausdrücke", oft auch "RegExp". Hierbei können bestimmte Zeichen verwendet, um die Suche nach bestimmten Textstellen oder -mustern zu matchen und nichtgewolltes leichter auszuschließen. Zur Veranschaulichung: Mit folgendem Code ist es uns möglich, alle Wörter die mit "a" anfangen und mit "en" enden zu entfernen, dafür ersetzen wir einfach mit "", also mit nichts, das Gefundene wird somit entfernt:
Es ist noch nicht wichtig den Ausdruck zu verstehen, das kommt alles dran, also keine Panik wenn Ihr mit diesem kryptischen Stück Code noch nichts anfangen könnt. Nach diesem Tutorial wisst Ihr all das richtig einzuordnen. Zunächst einmal ist zu sehen, das RegEx.Replace() hier mit 4 Parametern aufgerufen wurde:
- dem EingabeString, das ist der Text aus dem etwas ersetzt werden soll, hier der Text in der RTB
- der Reguläre Ausdruck, der den EingabeString -die RTB in unserem Fall- nach einem bestimmten Muster durchsucht
- der Ersetzen-Zeichenkette, diesmal "", also eben nichts, und
- der Suchoption, in unserem Beispiel wurde Groß-/Kleinschreibung ignoriert. Dieser, also der 4. parameter ist optional.
Aber was ging da vor sich? Einige Zeichen im Suchmuster werden als Reguläre Ausdrücke behandelt und können so nicht im Text als Strings gefunden werden. Der Punkt
.
hat als Ausdruck eine eigene Bedeutung, er steht hierbei für ein beliebiges Zeichen. Das können Sonderzeichen sein, Buchstaben oder Zahlen, Tabstopps, Zeilenumbrüche, Textanfänge oder -enden. Der Ausdruck a.s
würde also Beispielsweise die worte "als", "aus" oder "ass" finden, da das wort mit "a" beginnt, dem ein beliebiges Zeichen folgt und danach ein "s". Auch "a8s" oder "a!s" würde gefunden werden. Dem Fortgeschrittenen wird aufgefallen sein, dass das hier natürlich kein Wortanfang sein muss, auch "Haus" würde gefunden werden, dazu kommen wir aber gleich -> Würde man nach Sonderzeichen als Strings suchen wollen geht das auch, wie, erfahrt ihr weiter unten, anzumerken hier auch Stichwort "escapen"Hier eine Liste der Ausdrücke, deren Funktion und einem Beispiel:
.
Beliebiges ZeichenBeschreibung: Der
.
entspricht einem beliebigen darstellbaren Zeichen (abhängig von den RegExOptions werden whitespace-Zeichen gefunden oder auch nicht)Beispiel:
h.se
findet "hase", "hose" oder auch "h9se"h.s.
findet "hass", "hast" oder "Schiss". Aber wieso "Schiss"? Ganz einfach, weil vor "h" oder nach dem letzten "s" kein Leerzeichensteht, dieser Suchausdruck kann auch innerhalb eines Wortes sein.
*
0 oder mehr VorkommenBeschreibung: Findet 0 (null) oder mehr Vorkommen des vorangehenden Ausdrucks und ergibt somit alle möglichen Übereinstimmungen.
Beispiel: "Han*es" findet "Hannes", "Hannnnnes" oder "Hannnnnnnnnnes" aber auch "Hanes" und sogar "Haes"(wie gesagt, möglich ist 0 oder mehrmals). "Ha.*es" findet "Hannes", "Hastiges" oder "Haltendes" aber auch "Ha325!%es", da ja nicht festgelegt ist, welche Zeichen innerhalt des Wortes erlaubt sind, aber das kommt nachher noch alles mit "[" und "]". Um ".*" mal in Worte zu fassen: Der Ausdruck sucht "Ha", wenn gefunden, wird alles was dann kommt ebenfalls positiv gematcht. In dem Fall ".*" was soviel heißt wie "ein beliebiges Zeichen beliebig oft oder gar nicht". Und am Ende dann irgendwann "es". Für den größeren Teil der Leser dieses Tuts wird es jetzt verwunderlich sein wenn Ich sage, dass damit auch "Ha123xyz!eseseseseseses" gefunden würde, wir haben nicht festgelegt, dass die Übereinstimmungssuche gleich beim ersten vorkommen von "es" enden soll. Auch dafür gibt es eine Lösung, lest weiter, Ihr werdet wissen wann die Stelle kommt
+
1 oder mehr VorkommenBeschreibung: Findet mindestens ein oder beliebig viele Vorkommen des vorangehenden Ausdrucks
Beispiel: Im Gegensatz zu
*
würde bei Han+es
zwar auch "Hanes" "Hannes" oder "Hannnnnnnes" und so gefunden werden, jedoch NICHT "Haes", da der Ausdruck mindestens einmal vorkommen muss^
Anfang des String / der ZeileBeschreibung: Bezeichnet den Anfang eines Strings oder einer Zeile (je nach dem bei RegExOptions festgelegten Wert(en))
Beispiel:
^d
Findet ein "d" nur, wenn es am Anfang des Strings steht, der Ausdruck ^.*
findet Beispielsweise die erste Zeile des Strings bis zum Zeilenumbruch oder zum Textende, falls es nur eine Zeile ist.$
Ende des String / der ZeileBeschreibung: Bezeichnet das Ende eines Strings oder einer Zeile (je nach dem bei RegExOptions festgelegten Wert(en))
Beispiel: Wie
^
nur dass es mit $
das Ende eines Strings ist. Wäre der zu durchsuchende String nun:"Ich schreibe gerade einen Teststring" und würden wir nach
...$
suchen, so würden wir "ing" finden.?
0 oder 1 VorkommenBeschreibung: Der vorangehende Ausdruck kommt 0x (also gar nicht) oder 1x vor.
Beispiel:
a.*
(<- am ende ein leerzeichen!!!) findet im String "a b c d" nur "a b c ", da logischerweise nach "d" kein leerzeichen kommt. Mittels .*
wird bis dahin gesucht, was nach dem "*" steht, steht da nichts, dann wird höchstens bis zum nächsten Zeilenumbruch gesucht. ABER mit dem ?
Zeichen wird nur bis zum >ERSTEN< Vorkommen des nächsten Zeichens gesucht, also was nach dem ?
kommt. Schreiben wir nun ein Fragezeichen dazu, also a.*?
, so wird nur "a " gefunden, da nach diesem ja bereits schon das nächststehende Leerzeichen kommt. Komischerweise scheint das mit dem "?" in der VB-Hilfe vergessen worden zu sein. Also a.*?
findet alle wörter die mit "a" anfangen, und bis dahin, wenn ein Leerzeichen kommt. Im Text "Das ist mein RegEx-Tutorial fürs VB-Paradise Forum" würde mit dem eben genannten Suchausdruck "as ", "al " und "adise" gefunden werden. Würden wir bei dem Suchmuster vor dem "a" auch noch ein Leerzeichen platzieren, so würden wir im eben beschriebenen Text nichts finden da dort kein wort mit "a" anfängt.\n
ZeilenumbruchBeschreibung: Findet Zeilenumbrüche
Beispiel: Hier mal ein Test-text:
"Heute bin ich so mo
tiviert, dass ich angefangen h
abe, ein Tutorial für das Foru
m zu schreiben."
So, und wenn wir nun nach
.\n.
suchen würden, dann würden wir folgende Strings finden: "ot", "ha" und "um". Suchen wir nach ^.*?\n
so erhalten wir die komplette erste Zeile.===== Weiter im nächsten Post =========================================================================================================================
Hello World
Dieser Beitrag wurde bereits 17 mal editiert, zuletzt von „Link“ ()