[QUIZ #18] Reguläre Ausdrücke - Reverse Engineered

ComFreek

Mod | @comfreek
Moderator
Ist das nicht, ehm, falsch?
Was ist mit a-z und tausend anderen sachen die möglich sind?

Naja gut, a-z repräsentiert im Prinzip 26 Alternativen von eines einzelnen Zeichens. Das wäre rein theoretisch so, programmieren würde ich's natürlich anders.

Was defintiv noch fehlt sind Klammernausdrücke.
 

ComFreek

Mod | @comfreek
Moderator
Zeichenklassen sind auch endlich viele Alternativen.
Quantifier sind alle auf einen Stamm zurückzuführen.
Ein Quantifier besitzt eine bis zwei Eigenschaften:

- Die Mindestzahl an Vorkommen
- Die Maximalzahl an Vorkommen

Dies kann man ganz einfach in eine Schleife packen. Wenn die Zahl nach oben hin unbeschränkt ist, würde ich z.B. für die Maximalzahl -1 als "Konstante" vergeben.

Lookaheads und Lookbehinds sowie Backreferences müssen nicht zwingend implementiert werden, siehe auch eingeschränkte Syntax des ersten Posts ;)
 
Was defintiv noch fehlt sind Klammernausdrücke.
Klammerung ist nur eine Frage der Syntax. Ob ich die Baumstruktur eines regulären Ausdrucks nun aufmale oder linearisiert mit Hilfe von Klammern notiere ist für die Struktur unerheblich.

Zeichenklassen, andere Quantifier, look-arounds, "Backreferences" (Diese \1 für die erste Klammerung), etc
Zeichenklassen lassen sich auf Alternativen zurückführen, z.B.:
Code:
[aeiou] ? (a|e|i|o|u)
\d ? (0|1|2|3|4|5|6|7|8|9)
Beliebige Quantifier lassen sich ebenso mit den Basiskonstrukten ausdrücken, z.B.:
Code:
x? ? (|x)
x+ ? xx*
x{3,} ? xxxx*
x{2,4} ? (xx|xxx|xxxx)
Bei Lookarounds gibt es kein so klares Muster, aber auch diese ließen sich zurückführen (wenn es wie hier nur darum geht, ob ein regulärer Ausdruck eine Zeichenkette im ganzen erfasst oder nicht).

Erlaubt man Rückwärtsreferenzen, ist der Ausdruck nach Definition kein regulärer Ausdruck mehr, da damit mehr als nur reguläre Sprachen erkannt werden können. Insofern kann man diese natürlich auch nicht auf die Basiskonstrukte regulärer Ausdrücke zurückführen.

Grüße,
Matthias
 

alxy

Erfahrenes Mitglied
Hat jemand nen Array mit allen möglichen Zeichen die erlaubt sind?
Oder wenigstens fertige Arrays für zB die "Konstanten" wie \d ?
 

ComFreek

Mod | @comfreek
Moderator
Hat jemand nen Array mit allen möglichen Zeichen die erlaubt sind?
Oder wenigstens fertige Arrays für zB die "Konstanten" wie \d ?

Um mal einfach nur crack's Link zu zitieren:
php.net hat gesagt.:
\d any decimal digit
\D any character that is not a decimal digit
\h any horizontal whitespace character (since PHP 5.2.4)
\H any character that is not a horizontal whitespace character (since PHP 5.2.4)
\s any whitespace character
\S any character that is not a whitespace character\v any vertical whitespace character (since PHP 5.2.4)
\V any character that is not a vertical whitespace character (since PHP 5.2.4)
\w any "word" character
\W any "non-word" character
Du musst aber nur die fettgedruckten Zeilen unterstützen. (Bei \d kannst du die Menge auf 0-9 beschränken.)

Ansonsten sind ja alle Zeichen erlaubt, oder meintest du irgendwas speziell?

PS: Die Pipes ('|') bitte durch Backslashes ('\') im Zitat oben ersetzen. vBulletin zeigt komischerweise keine Backslashes an.
 

sheel

I love Asm
Hat jemand nen Array mit allen möglichen Zeichen die erlaubt sind?
Falls du den Ascii meinst (?) das sollte doch selbst machbar sein.
Nur ob eine Array-Whitelist für alles so toll ist, wenn man an Unicode denkt?
(man kanns natürlich machen und keiner fordert irgendwas von Unicode)

@Comfreek:
Das sind reine Backslashes, nur mit
Code:
font: italic 13px Tahoma,Calibri,Verdana,Geneva,sans-serif;
:D