Prüft, ob ein String dem Suchmuster eines regulären Ausdrucks entspricht.
StringRegExp ( "test", "pattern" [, flag = 0 [, offset = 1]] )
test | Die zu prüfende Eingabe |
pattern | Das Suchmuster des regulären Ausdrucks. |
flag | [optional] Eine Zahl, die die Verhaltensweise der Funktion bestimmt. Siehe weiter unten für Details. Der Standard ist 0. |
offset | [optional] Die Position des Strings, wo die Funktion beginnen soll (startet bei 1). Der Standard ist 1. |
Flag | Werte |
$STR_REGEXPMATCH (0) | Ein Pattern führt zu einem Match oder nicht. (1 oder 0) (Standard). |
$STR_REGEXPARRAYMATCH (1) | Es wird nur der erste SubMatch zu jedem Match ausgegeben (Array). |
$STR_REGEXPARRAYFULLMATCH (2) | Im Ergebnisarray wird an [0] der gesamte erste Match ausgegeben, an [1..n] folgen die SubMatches des ersten Matches. |
$STR_REGEXPARRAYGLOBALMATCH (3) | Im Ergebnisarray werden von allen Matches alle Submatches ausgegeben. |
$STR_REGEXPARRAYGLOBALFULLMATCH (4) | Im Ergebnisarray wird für jeden Match ein Array gespeichert. Diese Arrays enthalten: an [0] den gesamten Match, an [1..n] folgen die SubMatches dieses Matches. |
@error: | Bedeutung |
2 : | Falsches Muster. @Extended = Offset des Fehlers im Muster. |
@error: | Bedeutung |
0: | Array ist gültig. Siehe @extended für die weiteren Offsets überprüfen. |
1: | Array ist ungültig. Keine Übereinstimmungen. |
2: | Falsches Suchmuster, Array ist ungültig. @Extended = Offset des Fehlers im Muster. |
@error: | Bedeutung |
0: | Array ist gültig. |
1: | Array ist ungültig. Keine Übereinstimmungen. |
2: | Falsches Suchmuster, Array ist ungültig. @Extended = Offset des Fehlers im Muster. |
zum Testen verschiedener StringRegExp()-Muster - Danke steve8tch. Credit: w0uter
Reguläre Ausdrücke sind Strings, in denen einfache Textzeichen angeben, welcher Text in dem Zielstring existieren muss.
Einige Zeichen haben eine besondere Bedeutung, um anzugeben, welche Variabilität in dem Zielstring erlaubt ist. Für reguläre Ausdrücke in AutoIt ist normalerweise die Groß-/Kleinschreibung relevant.
Dabei kann man die gefundenen Strings entweder mit StringRegExp() extrahieren oder mit StringRegExpReplace() ersetzen.
Dabei sucht die Engine des Parses für die regulären Ausdrücke nach dem programmartigen Suchmuster und geht zur letzten erfolgreichen Suchstelle zurück, wenn ein Fund nicht mehr dem Format entspricht.
So geht es den gesamten Eingabestring durch und returnt je nach Flag die entsprechenden Ergebnisse.
Das sogenannte Backtracking ist eines der fundamentalsten Features eines Parsers für reguläre Ausdrücke und bereits jeder Programmierneuling sollte es bereits verstehen und täglich anwenden.
Es hinterlässt eine spezielle Haltemarke an jeder Weggabelung des Codes und man geht zu jener Haltemarke zurück wenn der aktuelle Codepfad sich als Sackgasse herausstellt.
Man backtrackt so weit zurück bis man entweder den richtigen Punkt findet (hier wäre es eine Übereinstimmung) oder bis man jeden Pfad erkundet hat ohne sein Ziel zu erreichen (keine Übereinstimmung gefunden).
Das suchen eines Dateinamens mit optionalen Wildcards (*) innerhalb einer Ordnerstruktur ist genau dasselbe.
AutoIt benutzt die PCRE Engine. PCRE bedeutet "Perl-Compatible Regular Expressions" und ist die umfassenste open-source Engine die verfügbar ist.
Diese Implementation bringt die sogenannte Unicode Category Properties (UCP) Unterstützung mit sich, welche es erlaubt die meisten von menschenhand entwickelten Sprachen sehr säuberlich zu parsen.
Um jedoch Vorgängerkompabilität zu alten AutoIt-Versionen zu wahren und die Geschwindigkeit der Übereinstimmungssuche so hoch wie möglich zu halten, ist der UCP Support standardmäßig nicht aktiviert.
Diese Seite ist nur eine Zusammenfassung der gängigsten Suchmuster. Für einen kompletten Einblick der PCRE-Suchmuster, welche in AutoIt implementiert sind, sollte man einen Blick auf diese Seite werfen.
Sollte man nicht bereits wissen wie reguläre Ausdrücke funktionieren, so sollte man sich vorher die verlinkte Dokumentation gründlich durchlesen um überhaupt im Ansatz zu wissen wie man an reguläre Ausdrücke angeht.
Reguläre Ausdrücke werden aus einem oder mehreren der folgenden einfachen Sonderzeichen gebildet. Ist ein Zeichen nicht in der folgenden Tabelle enthalten, dann steht es nur für sich selbst.
Wiederholungszeichen oder auch Quantifizierer genannt (*, +, ?, {...} ) versuchen die größtmögliche Entsprechung zu finden, außer wenn ihnen direkt ein Fragezeichen folgt; dann wird die kleinstmögliche Entsprechung der nachfolgenden Zeichen genommen.
Verschachtelte Gruppen sind erlaubt, aber es ist zu beachten, dass alle Gruppen dem zurückgegebenen Array zugewiesen werden, wobei die äußeren nach den inneren Gruppen berücksichtigt werden. Verwendet man statt der normalen Gruppierung () eine nicht-fangende Gruppierung (?: ... ) oder (?> ... ) wird die Gruppe dem zurückgegebenen Array nicht hinzugefügt.
Alles was in einer runden Klammer "()" steht wird als Gruppe bzw. Subpattern bezeichnet. Der Inhalt muß komplett in dem zu prüfenden Ausdruck enthalten sein. Alles was eingeklammert wird, wird in SubPatterns geschrieben. Diese können dann mit \1,\2...,\n abgerufen werden.
Alles was in einer eckigen Klammer "[]" steht wird als Set bezeichnet. Dort muß lediglich ein Zeichen in dem zu prüfenden Ausdruck enthalten sein.
Achtung: schlechte reguläre Ausdrücke können zu einer dauerhaft hohen CPU-Auslastung führen und diese eventuell beschädigen.
Pattern | Eine Regel mit der eine Zeichenfolge erkannt wird.. |
SubPattern | Ein Pattern kann Suchfolgen enthalten, die separat in einer Gruppe aufgefangen werden.. |
Match | Wird mit einem Pattern eine gültige Zeichenfolge erkannt, ist diese der Match. Je nach Art des Patterns und Inhalt des Teststrings sind mehrere Matches möglich. |
SubMatch | Die mittels eines SubPatterns gefundene Zeichenfolge. |
(*CR) | Wagenrücklauf (@CR). |
(*LF) | Zeilenvorschub (@LF). |
(*CRLF) | Wagenrücklauf gefolgt von einem Zeilenvorschub (@CRLF). |
(*ANYCRLF) | Irgendeins der @CRLF, @CR oder @LF Makros. Das ist die standardmäßige Zeilenumbruchkonvention. |
(*ANY) | Jegliche Unicode-Zeilenumbruchsfolge: @CRLF, @LF, VT, FF, @CR oder \x85. |
(*BSR_ANYCRLF) | Standardmäßig findet \R ein @CRLF, @CR oder @LF einzeln. |
(*BSR_UNICODE) | Bewirkt, dass \R eins der Unicode-Zeilenumbruchsfolgen findet: @CRLF; @LF, VT, FF, @CR oder \x85. |
(?i) | Ohne Groß-/Kleinschreibung: Bei der Auswertung des regulären Ausdrucks wird nach dem Flag nicht zwischen Groß-/Kleinschreibung unterschieden. Dies wird nicht als Gruppe behandelt. Wenn UCP aktiviert ist, so wirkt sich die Groß-/Kleinschreibung auf die gesamte Unicode Gruppe 0 aus. Standardmäßig nur auf die ASCII Zeichen A-Z und a-z. |
(?m) | Multiline: ^ und $ finden Zeilenschaltungen innerhalb der Datenmenge. Standardmäßig ist diese Option deaktiviert. |
(?s) | Singleline oder DotAll: . findet alle Zeichen, auch Zeilenumbrüche. Standardmäßig findet "." keine Zeilenumbrüche. |
(?U) | Nicht-Gierig: Kehrt die Standardeinstellung für Gierigkeit der Quantifzierer um und setzt sie auf faul (nicht gierig). Standardmäßig ist die Suche gierig, siehe unten für weitere Erläuterung. |
(?x) | Extended: Ignoriert Whitespace-Zeichen außerhalb von Charakterklassen und # beginnt ein Kommentar bis zur nächsten soliden Zeilenumbruch. Nichts sagend verbessern die Whitespaces zwischen den Komponenten die Leserlichkeit. Standardmäßig matchen Whitespaces sich selbst und # ist ein Zeichen. |
\a | Alarmzeichen, gleich dem Kontrollzeichen BEL (Chr(7)). |
\cX | Findet ein Kontrollzeichen, basierend auf dem nächsten Zeichen. Zum Beispiel, \cM entspricht Strg-M. Genau wie \x0D oder \r (Chr(13)). |
\e | Findet ein Escape-Zeichen (chr(27)). Nicht mit dem Escapen eines Zeichens verwechseln! |
\n | Findet einen Zeilenvorschub(@LF, chr(10)). |
\r | Findet ein Wagenrücklaufzeichen (@CR, chr(13)). |
\t | Findet einen Tabulator (chr(9)). |
\ddd | Findet Zeichen mit dem Oktalcode ddd, oder einer Rückreferenz sofern gefunden. Findet die vorgegangene Gruppennummer exakt. Beispielsweise ([:alpha:])\1 würde ein Doppelzeichen finden. |
\xhh | Findet ein Unicode-Zeichen mit dem Hexwert hh: Beispielsweise ist"\x7E" eine Tilde, "~". |
\x{hhhh} | Findet ein Unicode-Zeichen mit dem Hexwert hhhh: Beispielsweise ist "\x{20AC}" das Eurozeichen, "€" (ChrW(0x20AC)). |
\x | wobei x nicht alphanumerisch ist und somit das Literal "x" ist. Wird verwendet um Metazeichen als Literal zu interpretieren: "\.\[" wird als Punkt gefolgt von einer eckigen Klammer interpretiert also ".[". |
\Q ... \E | Wörtliche Sequence (Verbatim): Metazeichen verlieren ihre spezielle Bedeutung zwischen \Q und \E. "\Q(.)\E" findet "(.)". Es ist äquivalent zum Escapen des Charakters (vorhin erwähnt) und ist einfacher zu lesen als "\(\.\)". |
. | Findet jedes einzelne Zeichen außer, standardmäßig, eines Zeilenumbruchs. Findet auch Zeilenumbrüche wenn die Option (?s) aktiviert wurde. |
\d | Findet eine Dezimalziffer (0 bis 9). Auch jegliche Unicodedezimalziffer in jeglicher Sprache sofern UCP aktiviert wurde. |
\D | Findet alles außer Ziffern. |
\h | Findet alle waagerechten Whitespace-Zeichen (siehe Tabelle weiter unten). |
\H | Findet alle Zeichen außer waagerechte Whitespace-Zeichen. |
\N | Findet alle Zeichen außer Zeilenumbrüche ungeachtet dessen ob die Option (?s) aktiviert wurde. |
\p{ppp} | Nur wenn UCP aktiviert wurde: Findet alle Unicode-Zeichen mit der Eigenschaft ppp. Beispielsweise findet "\b\p{Cyrillic}+" alle kyrillischen Wörter. "\p{Sc}" jegliches Währungssymbol. Siehe die oben genannte Dokumentation für weitere Erläuterungen und Details. |
\P{ppp} | Nur wenn UCP aktiviert wurde: Findet alle Unicode-Zeichen die nicht die gegebene Eigenschafft ppp haben. |
\R | Findet alle Unicode-Zeilenumbrüche standardmäßig oder die der aktiven (*BSR_...) Einstellung. Standardmäßig findet \R "(?>\r\n|\n|\r)" wobei "(?>...)" eine atomare Gruppe ist welche die Folge "\r\n" (@CRLF) nicht umbrechbar macht. |
\s | Findet alle Whitespace-Zeichen: Chr(9) bis Chr(13), welche Tabulator, Zeilenschaltung, senkrechter Tab, Seitenvorschub, Wagenrücklauf und das Leerzeichen sind ( Chr(32) ). |
\S | Findet alles außer Whitespace-Zeichen. |
\v | Findet alle vertikalen Whitespace-Zeichen (siehe Tabelle weiter unten). |
\V | Findet alle Zeichen außer vertikale Whitespace-Zeichen. |
\w | Findet alle Wörterzeichen: a-z, A-Z ,0-9 oder Unterstrich (_). |
\W | Findet alle Nicht-Wörterzeichen. |
\X | Nur wenn UCP aktiviert wurde: findet alle erweiterten Unicode Grapheme Cluster welches eine nicht umbrechbare Sequenz an Codepunkten ist welche ein einziges Zeichen für einen Nutzer darstellen. Als Konsequenz findet \X mehr als ein Zeichen im Eingabestring gegenteilig zu all den anderen Sequenzen in dieser Tabelle. |
[ ... ] | Findet jedes Zeichen in der Menge. [aeiou] findet alle kleingeschriebenen Vokale. Eine zusammenhängende Menge kann definiert werden, indem ein Bindestrich zwischen dem ersten und letzten Zeichen gesetzt wird. [a-z] findet alle kleingeschriebenen Zeichen. Um einen Bindestrich in einer Menge einzubeziehen (-), ist der Bindestrich als erstes, letztes Zeichen des Sets zu verwenden oder er kann auch escaped werden (\-). Man sollte beachten, dass das Muster "[A-z]" nicht dasselbe wie "[A-Za-z]": das Vorherige ist äquivalent zu "[A-Z\[\\\]^_`a-z]". Um eine schließende Klammer in einer Menge zu verwenden, ist es als erstes Zeichen in der Menge zu verwenden oder man muss ihn escapen: "[][]" und "[\[\]]" werden beide entweder "[" oder "]" finden. Es ist zu beachten, dass in einer Charakterklasse nur \d, \D, \h, \H, \p{}, \P{}, \s, \Q...\E, \S, \v, \V, \w, \W, und \x Sequenzen ihre besondere Bedeutung behalten, wobei \b gleich dem Backspacezeichen ist (Chr(8)). |
[^ ... ] | Findet alle Zeichen welche nicht in der Menge enthalten sind: "[^0-9]" findet alle Nicht-Ziffern. Um ein Caret (^) in die Menge einzubinden, muss es nach dem Anfang der Menge stehen oder seine Bedeutung muss mittels Escaping aufgehoben werden (\^). |
[:alnum:] | ASCII-Zeichen und Ziffern (die selben wie [^\W_] oder [A-Za-z0-9]). Wenn UCP aktiviert wurde: Unicode-Zeichen (die selben wie [^\W_] oder \p{Xan}). |
[:alpha:] | ASCII-Zeichen (die selben wie [^\W_] oder [A-Za-z]). Wenn UCP aktiviert wurde: Unicode-Zeichen (die selben wie [^\W_] oder \p{L}). |
[:ascii:] | ASCII-Zeichen (die selben wie ([\x00-\x7F])). |
[:blank:] | Leerzeichen oder Tab (@TAB) (die selben wie \h oder [\x09\x20]). Wenn UCP aktiviert wurde: horizontale Unicode-Whitespaces (die selben wie \h). |
[:cntrl:] | ASCII-Kontroll-Zeichen (die selben wie (Chr(0) ... Chr(31) und Chr(127))). |
[:digit:] | ASCII-Dezimalziffern (die selben wie \d oder [0-9]). Wenn UCP aktiviert wurde: Unicode-Dezimalziffern (die selben wie \d oder \p{Nd}). |
[:graph:] | ASCII-Druck-Zeichen, ohne dem Leerzeichen (die selben wie Chr(33) ... Chr(126)). |
[:lower:] | ASCII-Kleinbuchstaben-Zeichen (die selben wie [a-z]) Wenn UCP aktiviert wurde: Unicode-Kleinbuchstaben-Zeichen (die selben wie \p{L1}). |
[:print:] | ASCII-Druck-Zeichen, mit dem Leerzeichen (die selben wie (Chr(32) ... Chr(126)) |
[:punct:] | ASCII-Punkt-Zeichen, [:print:] ohne [:alnum:] und dem Leerzeichen (33-47, 58-64, 91-96, 123-126) |
[:space:] | ASCII-Whitespace-Zeichen (die selben wie [\h\x0A-\x0D]). [:space:] ist nicht genau das gleiche wie \s: es beinhaltet VT, Chr(11). |
[:upper:] | ASCII-Großbuchstaben-Zeichen (die selben wie [A-Z]). Wenn UCP aktiviert wurde: Unicode-Großbuchstaben-Zeichen (die selben wie \p{Lu}). |
[:word:] | ASCII-"Wort"-Zeichen (die selben wie \w oder [[:alnum:]_]). Wenn UCP aktiviert wurde: Unicode-"Wort"-Zeichen (die selben wie \w oder [[:alnum:]_] oder \p{XwD}). |
[:xdigit:] | Hexadezimale Ziffern (die selben wie [0-9A-Fa-f]). |
( ... ) | Gruppe. Die Elemente in der Gruppe werden in Reihenfolge bearbeitet und können zusammen wiederholt werden. Zum Beispiel entspricht"(ab)+c" "abc" oder "ababc", aber nicht "abac". Eine Gruppe speichert auch den Text ab, der mit der Menge übereinstimmt, um ihn bei einem Rückverweis und in dem Rückgabearray der Funktion zu benutzen, abhängig von dem Flag-Parameter. Sie werden nummeriert beginnend von der 1 in der Reihenfolge wie ihre Klammeröffnungen sind. Gruppen können auch als Unterroutinen in einem anderen Bereich des Musters behandelt werden, sogar rekursiv. |
(?<name> ... ) | Benannte Gruppe. Kann später mittels Name sowie als Nummer referenziert werden. Es sollte vermieden werden den Namen "DEFINE" zu verwenden (Siehe "Bedinge Muster"). |
(?: ... ) | Nicht-fangende Gruppe. Speichert keine der übereinstimmenden Zeichen im Array und kann nicht als Rückreferenz verwendet werden. |
(?| ... ) | Nicht-fangende Gruppe mit Reset. Setzt die Gruppe in jeder Top-Level-Alternative (höchste Klammerung) zurück:" "(?|(Mon)|(Tue)s|(Wed)nes|(Thu)rs|(Fri)|(Sat)ur|(Sun))day" findet einen Wochentag und ihre Abkürzung in der Gruppennummer 1. |
(?> ... ) | Atomare nicht-fangende Gruppe: Speert und backtrackt von dem was gefunden wurde. (Siehe Quantifizierer und Gierigkeit weiter unten.) Atomare Gruppen, wie besitzergreifende Quantifizierer, sind immer gierig. |
(?# ... ) | Kommentargruppe: Werden immer ignoriert (darf keine geschlossene Klammern ")" enthalten, aus diesem Grunde sind sie auch nicht schachtelbar). |
? | 0 oder 1, gierig. |
?+ | 0 oder 1, besitzergreifend. |
?? | 0 oder 1, faul. |
* | 0 oder mehr, gierig. |
*+ | 0 oder mehr, besitzergreifend. |
*? | 0 oder mehr, faul. |
+ | 1 oder mehr, gierig. |
++ | 1 oder mehr, besitzergreifend. |
+? | 1 oder mehr, faul. |
{x} | genau x. |
{x,y} | mindestens x und nicht mehr als y, gierig. |
{x,y}+ | mindestens x und nicht mehr als y, besitzergreifend. |
{x,y}? | mindestens x und nicht mehr als y, faul. |
{x,} | x oder mehr, gierig. |
{x,}+ | x oder mehr, besitzergreifend. |
{x,}? | x oder mehr, faul. |
X|Y | Findet entweder das Untermuster X oder Y: "ab|dc|ground" findet "ac" oder "dc" oder "ground". |
\n | Referenziert eine vorgegangene Gruppe durch ihre absolute Nummer. Warnung: Wenn die Gruppennummer n nicht existiert, wird es als Zeichen mit einem Wert n behandelt. Sofern n keine gültige Oktalzahl ist erfolgt ein Error. Aufgrund dieser Mehrdeutigkeit ist diese Form nicht zu empfehlen. Die nachfolgenden Formen sind eher zu bevorzugen. |
\gn | Referenziert eine vorgegangene Gruppe durch ihre absolute Nummer. |
\g{n} | Referenziert eine vorgegangene Gruppe durch ihre absolute Nummer. Ähnlich wie das obere aber hier wird deutlich wo n beginnt und aufhört: Hilfreich wenn die folgenden Zeichen Ziffern sind. |
\g-n | Referenziert eine vorgegangene Gruppe durch ihre relative Nummer. |
\k<name> | Referenziert eine vorgegangene Gruppe durch ihren Namen. |
(?R) or (?0) | Führt das gesamte Suchmuster rekursiv neu aus. |
(?n) | Ruft ein Untermuster durch ihre absolute Nummer auf. |
(?+n) | Ruft ein Untermuster durch ihre relative Nummer auf. |
(?-n) | Ruft ein Untermuster durch ihre relative Nummer auf. |
(?&name) | Ruft ein Untermuster durch ihren Namen auf. |
^ | Das Caret-Zeichen findet außerhalb einer Charakterklasse den Start des Eingabestrings und den Beginn einer neuen Zeile nach einem nicht-finalen Zeilenumbruch (nicht-final bedeutet, das danach noch Text folgt) sofern die Option (?m) aktiv ist. Standardmäßig ist die Zeilenumbruchsfolge der Wagenrücklauf @CRLF. Innerhalb einer Charakterklasse komplementiert das Caret ^ die Klasse indem es alle Buchstaben die danach folgen nicht findet. |
$ | Außerhalb einer Charakterklasse findet das Dollar-Zeichen das Ende des Eingabestrings oder das Ende einer Zeile markiert durch einen Zeilenumbruch sofern (?m) aktiv ist. Innerhalb einer Charakterklasse wird das $ als Literal behandelt und hat keine spezielle Bedeutung. |
\A | Findet nur am absoluten Anfang des Eingabestrings unabhängig von der multiline-Option (?m). Findet nie wenn der Offset nicht 1 ist. |
\G | Findet nur wenn die aktuelle Position die Position des ersten Fundes im Eingabestring ist. |
\z | Findet nur am Ende des Eingabestrings unabhängig von der multiline-Option (?m). |
\Z | Findet nur am Ende des Eingabestrings oder vor einem Zeilenumbruch am Ende unabhängig von der multiline-Option (?m). |
\b | Findet bei Wortgrenze. Das heißt zwischen Zeichen und nicht beide \w oder \W. Siehe \w für die Bedeutung des Kennzeichners "Wort". Innerhalb einer Charakterklasse bedeutet \b ein Backspace (Chr(8)). |
\B | Findet wenn es nicht an der Wortgrenze ist. |
(?=X) | Positiv Folgend: Findet, wenn das Untermuster X an der aktuellen Abfrageposition übereinstimmt. |
(?!X) | Negativ Folgend: Findet, wenn das Untermuster X an der aktuellen Abfrageposition nicht übereinstimmt. |
(?<=X) | Positiv Vorangehend: Findet, wenn das Untermuster X an den vorangehenden Zeichen übereinstimmt. Das Untermuster X muss eine feste Länge besitzen und darf nicht undefinierte Quantifizierer wie * + oder ? enthalten. |
(?<!X) | Negativ Vorangehend: Findet, wenn das Untermuster X an den vorangehenden Zeichen nicht übereinstimmt. Das Untermuster X muss eine feste Länge besitzen und darf nicht undefinierte Quantifizierer wie * + oder ? enthalten. |
\K | Setzt den Beginn eines Fundes an die aktuelle Abfrageposition im Eingabestring. Man sollte dabei beachten, dass bereits gefangene Gruppen nun alleine stehen und immer noch im Rückgabearray auftauchen und dadurch ist es möglich sie später auch zu referenzieren. Die Aktion durch \K ist ähnlich aber nicht identisch zum vorangehenden Vorgehensweise (look-behind) und unterscheidet sich darin, dass \K mit verschiedenen Längen arbeiten kann. |
(?(Bedingung)yes-pattern) | Erlaubt die bedingte Ausführung eines Musters. |
(?(Bedingung)erfüllendes-Muster|nicht-erfüllendes-Muster) | Wählt zwischen zwei bestimmten Mustern je nachdem Ergebnis der (Bedingung). |
(n) | Testet, ob die gefangene Gruppe mit einer absoluten Nummer n gefunden wurde. |
(+n) | Testet, ob die gefangene Gruppe mit einer relativen Nummer +n gefunden wurde. |
(-n) | Testet, ob die gefangene Gruppe mit einer relativen Nummer -n gefunden wurde. |
(<name>) | Testet, ob die gefangene Gruppe mit dem Namen name gefunden wurde. |
(R) | Testet, ob eine Rekursion stattfand. |
(Rn) | Testet, ob die letzte Rekursion für eine gefangene Gruppe mit der absoluten Nummer n war. |
(R&name) | Testet, ob die letzte Rekursion für eine gefangene Gruppe mit dem Namen name war. |
(DEFINE) | Wird ohne Pattern benutzt und erlaubt die Zuweisung der Unterroutine von woanders. "(?x) (?(DEFINE) (?<byte> 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d) )" definiert die Unterroutine "byte" welche eine der Komponenten einer IPv4-Adresse findet. Die eigentliche Adresse kann mit "\b (?&byte) (\.(?&byte)){3} \b" gefunden werden. |
(assertion) | Hier ist assertion ist entweder eine positive oder negative, vorangehende (look-behind) oder folgende (look-ahead) Assertion (Behauptung). |
(?J) | Erlaubt Dubletten in Gruppen- und Unterroutinennamen (hier nicht weiter erläutert). |
(?X) | Verursacht Fehler durch einige out-of-context Sequenzen. |
(*J) | Aktiviert die Javascript-Kompatibilität (hier nicht weiter erläutert). |
(*LIMIT_MATCH=n) | Limitiert die Anzahl der Funde auf n. |
(*LIMIT_RECURSION=n) | Limitiert die maximale Rekursionstiefe auf n. |
(*NO_START_OPT) | Deaktiviert einige Optimierungen (hier nicht weiter erläutert). |
(*ACCEPT) | Erzwingt einen sofortigen Sucherfolg in der aktuellen Unterroutine oder im Top-Level-Muster (dem höchsten). |
(*FAIL) or (*F) | Erzwingt einen sofortigen Suchmisserfolg. |
(*MARK:name) or (*:name) | (Siehe Referenzdokumentation.) |
(*COMMIT) | (Siehe Referenzdokumentation.) |
(*PRUNE) | (Siehe Referenzdokumentation.) |
(*PRUNE:name) | (Siehe Referenzdokumentation.) |
(*SKIP) | (Siehe Referenzdokumentation.) |
(*SKIP:name) | (Siehe Referenzdokumentation.) |
(*THEN) | (Siehe Referenzdokumentation.) |
(*THEN:name) | (Siehe Referenzdokumentation.) |
StringInStr, StringRegExpReplace
; Option 1, Verwendung eines Offsets
#include <MsgBoxConstants.au3>
#include <StringConstants.au3>
Local $aArray = 0, _
$iOffset = 1, $iOffsetStart
While 1
$iOffsetStart = $iOffset
$aArray = StringRegExp('<test>a</test> <test>b</test> <test>c</Test>', '(?i)<test>(.*?)</test>', $STR_REGEXPARRAYMATCH, $iOffset)
If @error Then ExitLoop
$iOffset = @extended
For $i = 0 To UBound($aArray) - 1
MsgBox($MB_SYSTEMMODAL, "Option 1 bei " & $iOffsetStart, $aArray[$i])
Next
WEnd
; Option 2, einfacher Rückgabewert, php/preg_match()-Stil
#include <MsgBoxConstants.au3>
#include <StringConstants.au3>
Local $aArray = 0, _
$iOffset = 1, $iOffsetStart
While 1
$iOffsetStart = $iOffset
$aArray = StringRegExp('<test>a</test> <test>b</test> <test>c</Test>', '(?i)<test>(.*?)</test>', $STR_REGEXPARRAYFULLMATCH, $iOffset)
If @error Then ExitLoop
$iOffset = @extended
For $i = 0 To UBound($aArray) - 1 Step 2
MsgBox($MB_SYSTEMMODAL, "Option 2 bei " & $iOffsetStart, $aArray[$i] & @TAB & "captured = " & $aArray[$i + 1])
Next
WEnd
; Option 3, globale Rückgabe, alter AutoIt-Stil
#include <Array.au3>
#include <StringConstants.au3>
Local $aArray = StringRegExp('<test>a</test> <test>b</test> <test>c</Test>', '(?i)<test>(.*?)</test>', $STR_REGEXPARRAYGLOBALMATCH)
#cs
1. Capturing Gruppe (.*?)
. Findet jedes einzelne Zeichen außer, standardmäßig, eines Zeilenumbruchs
*? findet Zeichen zwischen null und unbegrenzt oft, aber so wenig wie möglich, Erweiterung nach Bedarf (träge)
#ce
_ArrayDisplay($aArray, "Option 3 Ergebnisse")
; Option 4, globale Rückgabe, php/preg_match_all()-Stil
#include <Array.au3>
#include <MsgBoxConstants.au3>
#include <StringConstants.au3>
Local $aArray = StringRegExp('F1oF2oF3o', '(F.o)*?', $STR_REGEXPARRAYGLOBALFULLMATCH)
#cs
1. Capturing Gruppe (F.o)*?
*? findet Zeichen zwischen null und unbegrenzt oft, aber so wenig wie möglich, Erweiterung nach Bedarf (träge)
#ce
_ArrayDisplay($aArray, "Option 4 Ergebnisse")
Local $aMatch = 0
For $i = 0 To UBound($aArray) - 1
$aMatch = $aArray[$i]
If UBound($aMatch) > 1 Then
_ArrayDisplay($aMatch, "Array #" & $i)
Else
MsgBox($MB_SYSTEMMODAL, "Array #" & $i, "'" & $aMatch[0] & "' StringLen = " & StringLen(StringLen))
EndIf
Next
#include <Array.au3> _Example() Func _Example() Local $sHTML = _ '<select id="OptionToChoose">' & @CRLF & _ ' <option value="" selected="selected">Choose option</option>' & @CRLF & _ ' <option value="1">Sun</option>' & @CRLF & _ ' <option value="2">Earth</option>' & @CRLF & _ ' <option value="3">Moon</option>' & @CRLF & _ '</select>' & @CRLF & _ '' Local $aOuter = StringRegExp($sHTML, '(?is)(<option value="(.*?)"( selected="selected"|.*?)>(.*?)</option>)', $STR_REGEXPARRAYGLOBALFULLMATCH) _ArrayDisplay($aOuter, '$aOuter') Local $aInner For $IDX_Out = 0 To UBound($aOuter) - 1 $aInner = $aOuter[$IDX_Out] _ArrayDisplay($aInner, '$aInner = $aOuter[$IDX_Out] ... $IDX_Out = ' & $IDX_Out) Next EndFunc ;==>_Example
#Region ;************ Includes ************
#include <Array.au3>
#EndRegion ;************ Includes ************
$sTest = "Name Paul (Müller). Name Hans (Schmidt oder Meier)."
$sPattern = "Name\h(\w+)\h*\(([^\)]*)\)"
#cs
Name\h "Name" gefolgt von einem horizontalen Tab/Leerzeichen.
(\w+) Eine Folge von Wörterzeichen [a-zA-Z_0-9], 1-mal oder mehr, in einer Gruppe aufgefangen - Vorname.
\h*\( Horizontale Tabs/Leerzeichen, 0-mal oder mehr, gefolgt von öffnender Klammer.
([^\)]*) Alle Zeichen außer schließender Klammer, 0-mal oder mehr, in einer Gruppe aufgefangen - Nachname(n).
\) Am Ende eine schließende Klammer.
#ce
Global $a2D[0][2]
Global $iArrayIdx = -1
$aMatch = StringRegExp($sTest, $sPattern, 1) ; $STR_REGEXPARRAYMATCH
ConsoleWrite("$aMatch --> " & _cwArray($aMatch, 1) & @LF) ; ==> Paul | Müller
$aMatch = StringRegExp($sTest, $sPattern, 2) ; $STR_REGEXPARRAYFULLMATCH
ConsoleWrite("$aMatch --> " & _cwArray($aMatch, 2) & @LF) ; ==> Name Paul (Müller) | Paul | Müller
$aMatch = StringRegExp($sTest, $sPattern, 3) ; $STR_REGEXPARRAYGLOBALMATCH
ConsoleWrite("$aMatch --> " & _cwArray($aMatch, 3) & @LF) ; ==> Paul | Müller | Hans | Schmidt oder Meier
$aMatch = StringRegExp($sTest, $sPattern, 4) ; $STR_REGEXPARRAYGLOBALFULLMATCH
ConsoleWrite("$aMatch --> " & _cwArray($aMatch, 4) & @LF) ; ==> [a-0]: Name Paul (Müller) | Paul | Müller | [a-1]: Name Hans (Schmidt oder Meier) | Hans | Schmidt oder Meier
Func _cwArray($a, $iFlag, $sText = "")
Local $s
For $i = 0 To UBound($a) - 1
If IsArray($a[$i]) Then
$iArrayIdx += 1
$s &= "[a-" & $iArrayIdx & "]: " & _cwArray($a[$i], $iFlag, " (Unter-Array) " & $i)
Else
If $iFlag = 4 Then _ArrayAdd($a2D, '{Array} ' & $iArrayIdx & ' Item ' & $i & '|' & $a[$i])
$s &= $a[$i] & " | "
EndIf
Next
If $iFlag < 4 Then
_ArrayDisplay($a, "Flag " & $iFlag & $sText)
Else
If Not StringInStr($sText, " (Unter-Array) ") Then
_ArrayDisplay($a2D, "Flag " & $iFlag & " (Unter-Arrays) ")
EndIf
EndIf
Return $s
EndFunc ;==>_cwArray
#include <Array.au3>
#include <Constants.au3>
; ----------------- Anwendung von ?<!
; Suchmuster:
; alles außer "142"
; DANN "Hallo"
Dim $array[2]
$array[0] = "142Hallo"
$array[1] = "412Hallo"
For $i = 0 To UBound($array) - 1
$regexp = StringRegExp($array[$i], "(?<!142)(Hallo)", 3)
_ArrayDisplay($regexp, $array[$i])
Next
#include <Array.au3>
#include <Constants.au3>
; ----------------- Anwendung von Wiederholungszeichen
; Suchmuster:
; 2x Zahl
; 1x .
; 2x Zahl
; 1x .
; 4x Zahl
Dim $array[2]
$array[0] = "23.08.2010"
$array[1] = "23.08.10"
For $i = 0 To UBound($array) - 1
$regexp = StringRegExp($array[$i], "\d{2}\.\d{2}\.\d{4}", 3)
_ArrayDisplay($regexp, $array[$i])
Next
#include <Array.au3>
#include <Constants.au3>
; ----------------- Anwendung von \b
; Durch das Voranstellen von \b und das anhängen von \b an das Ende wird nur an der Wortgrenze gesucht.
; "Abgrund oder folge" wird nicht gefunden, da das Wort Abgrund und nicht Grund heisst
$sString = _
"Grund oder Folge der Armut?" & @CRLF & _
"Fahre ich in den Abgrund oder folge ich der Straße?"
$aResult = StringRegExp($sString, "(?i)\bgrund oder folge\b", 3)
_ArrayDisplay($aResult, "StringRegExp Results")
#include <Array.au3>
#include <Constants.au3>
; ----------------- Anwendung von gierigen und faulen Wiederholungszeichen
; Das erste * ist gierig. Es wird die längste Stelle gesucht
$aRegExp = StringRegExp("Die Abkürzung 'ISP' heißt 'Internet Service Provider'.", ".*'(.*)'.*", 3)
_ArrayDisplay($aRegExp)
; Durch anhängen eines ? wird es faul und es wird die kürzeste Stelle gesucht
$aRegExp = StringRegExp("Die Abkürzung 'ISP' heißt 'Internet Service Provider'.", ".*?'(.*?)'.*", 3)
_ArrayDisplay($aRegExp)
; Das erste * ist gierig. Es wird die längste Stelle gesucht
$aRegExp = StringRegExp("12-34.abc.def@mail.de", "(.*)\.(.*)*@(.*)\.(.*)", 3)
_ArrayDisplay($aRegExp)
; Durch anhängen eines ? wird es faul und es wird die kürzeste Stelle gesucht
$aRegExp = StringRegExp("12-34.abc.def@mail.de", "(.*?)\.(.*)*@(.*)\.(.*)", 3)
_ArrayDisplay($aRegExp)
#include <Array.au3>
#include <Constants.au3>
; ----------------- Anwendung von \n
; Das erste Wort (auf welches " Email: " folgt) wird in einer temporären Variable gespeichert (weil eingeklammert)
; Diese Variable wird mit \1 abgerufen. Die 1 steht dabei für die Nummer des Subpatterns.
$sString = "Name Email: Name@web.de" & @CRLF
$sString &= "Name Email: Peter@live.de" & @CRLF
$sString &= "Acanis Email: Acanis@gmx.net" & @CRLF
$sString &= "Acanis Email: Coolertyp@googlemail.com" & @CRLF
$aRegExp = StringRegExp($sString, "(\w+) Email: (\1@\w+\.\w+)", 3)
_ArrayDisplay($aRegExp)
#include <Array.au3>
#include <Constants.au3>
; ----------------- Anwendung von ?:
; Das folgende Beispiel soll aufzeigen, wie ein Subpattern gespeichert wird und wie nicht.
$sString = "Mein Name ist Peter" & @CRLF
$sString &= "Mein Name ist Karl" & @CRLF
$sString &= "Mein Name ist Max" & @CRLF
; So würde nur das Subpattern zurückgegeben werden
$aResult = StringRegExp($sString, "Mein Name ist (Karl|Max)", 3)
_ArrayDisplay($aResult)
; Durch voranstellen von ?: wird das Subpattern nicht gespeichert und es wird der komplette Satz als Ergebnis zurückgegeben
$aResult = StringRegExp($sString, "Mein Name ist (?:Karl|Max)", 3)
_ArrayDisplay($aResult)
#include <Array.au3>
#include <Constants.au3>
; ----------------- Verwendung von Subpatterns
; Das folgende Beispiel soll aufzeigen, wie ein Subpattern gespeichert wird und dieses dann später wieder verwendet wird.
$date = '01.03.2008' ; YYYY/MM/DD
$new = StringRegExpReplace($date, "(\d{2})\.(\d{2})\.(\d{4})", "$3/$2/$1")
MsgBox($MB_OK, "", $new)
#include <Array.au3>
#include <Constants.au3>
; ----------------- Verwendung von Wiederholungszeichen.
; Hier wird der Inhalt der Gruppe überschrieben, sobald ein Wiederholungszeichen auf die Gruppe angewandt wird
$sText = "aaabacad"
$aRet = StringRegExp($sText, "(a.)+", 3)
_ArrayDisplay($aRet)
#include <Array.au3>
#include <Constants.au3>
; ----------------- Anwendung von Wiederholungszeichen
; Suchmuster:
; 1x "P"
; mindestens 1x "a"
; 1x "r"
Dim $array[2]
$array[0] = "Ich habe 10 Paaaaaar zu Hause"
$array[1] = "Ich habe 10 Par zu Hause"
For $i = 0 To UBound($array) - 1
$regexp = StringRegExp($array[$i], "Pa+r", 3) ;alternativ: Pa{1,}r
_ArrayDisplay($regexp, $array[$i])
Next
#include <Array.au3>
#include <Constants.au3>
; ----------------- Anwendung von Oder und ?:
; Suchmuster:
; "-XY" ODER " XY" (?:\-XY| XY) >>> durch ?: wird nicht nur das Ergebnis der Oder-Bedingung sondern auch der Rest im Array ausgegeben
; DANN Zahlen (beliebige Anzahl) \d*
; DANN "-" \-
Dim $array[2]
$array[0] = "425-65-XY4587543-ghzgt7"
$array[1] = "4 25-65 XY4587543-ghzgt7"
For $i = 0 To UBound($array) - 1
$regexp = StringRegExp($array[$i], "(?:\-XY| XY)\d*\-", 3)
_ArrayDisplay($regexp, $array[$i])
Next