Hallo Bernhard,
Entweder reden wir aneinander vorbei, oder ich versteh's wirklich nicht.
Reguläre ausdrücke sind stark von einer verwendeten Engine abhängig. Jedes reale Programm, welches Reguläre Ausdrücke versteht, besitzt eine bestimmte Grammatik. Ob das nu Perl. sed, emacs, oder was auch immer ist.
Auch wenn wir hier nicht von regulären Ausdrücken sprechen, die in einem Programm implementiert sind, so muß ein bestimmtes Regelwerk vorhanden sein. Du sagst z.B. es dürfen keine ? und {0,1} vorkommen.
Auch ist es von fundamentaler Bedeutung festzulegen, wann die Mustererkennung zu einem positiven Ergebnis kommt. Ein 'dingsda', welche die Regex zur Entscheidungsfindung verwendet, wird, so lautet eigentlich die vorgabe bei regulären ausdrücken, immer versuchen, einen Treffer zu finden.
Daher meine Frage nach dem Regelwerk. Ohne diesem Regelwerk ist eine gültige Lösung nicht zu finden.
Beispiel 1:
Vorgabe: Positives Matching ist nur möglich, wenn der gesamte untersuchte Ausdruck übereinstimmt.
- matched bei 1 oder mehr
* bei 0 oder mehr
in verbinung mit () stellt mögliche Teilausdrücke dar
Regex: (acbcab)+
Beispiel 2:
Wie 1 jedoch Positives Matching ist möglich, wenn ein Teil des untersuchten Ausdrucks übereinstimmt.
^ stellt den Beginn, $ das Ende des Ausdrucks dar
Regex: ^(acbcab)+$
Hier müssen wir unbedingt einen Mechanismus einführen, der uns ermöglicht, daß wir den gesamten Ausdruck auch beschreiben können.
Sonst ist es uns unmöglich, eine vollständige Beschreibung zu formulieren.
Es ist ja auch in der Praxis so, daß die Regex stark von dem vorgegebenen Regelwerk abhängig ist. DU kannst ja auch nicht jede in Perl funktionierende Regex in awk einsetzen, da das zugrundeliegende Regelwerk geändert wurde.
Hallo Klaus!
Du hast übrigens im Ursprungsposting keinerlei Vorgaben gemacht, was die Möglichkeiten Deiner Engine betrifft.
Die Engine, wie du sagst, ist ein Automat. Keine Programmiersprache, bzw. Interpreter, ... Es ist ein abstraktes Problem: Ein Automat liest ein Zeichen nach dem anderen ein, im übrigen immer ganze Wörter, also Leerzeichen davor und dahinter und sieht nach, ob das Wort Teil der Sprache ist, die von dem Regulären Ausdruck, bzw. der daraus ableitbaren regulären Grammtik beschrieben wird.
Hier haben wir wieder das Problem. _Wie_ erkennt der Automat die Wortgrenze?
Nur mit einem Regelwerk, welches genau festlegt, wie Wortgrenzen erkannt werden, ist das Problem zu lösen. Es kann durchaus auch sein, daß die Regex
\b(acabab)+\b
heißt, wenn '\b' im Regelwerk als Wortgrenze definiert ist. Allerdings würde eine übliche Regexe-Engine nicht erkennen, ob das nächste Wort nicht ungültig ist.
Genausogut kann ^ und $ herangezogen werden, wenn das Regelwerk es erlaubt, und der zu untersuchende Ausdruck nur ein Wort sein kann. Ist alles Definitionssache.
wie oben, es sollen ganze Wörter sein, und das Wort 'acc' ist eindeutig kein Wort der Sprache :-(
Nochmals, woran erkennt der Automat das Ende des Wortes? Sicherlich nicht am Ende eines gültigen Matching.
Solange Du Dir über das gesamte Regelwerk für eine zu verwendende Regex im Klaren bist, ist die Aufgabe auch nicht lösbar. Leider:-(
Ich könnte ja auch sagen:
[ steht für Anfang des Ausdrucks
] steht für Ende des Ausdrucks
für 1 oder mehr
{} für strukturelle zusammenfassung
, als Trennzeichen von Alternativen
daraus ergibt sich folgende Regex:
[{ac,bc,a,b}#]
Diese regex würde auch nur matchen, wenn gültige Wörter in Deiner Sprache übergeben werden. Nur die Formulierung ist anders.
BTW.: Das Leerzeichen ist _kein_ gültiges Sprachelement in der von Dir ursprünglich vorgestellten Sprache.
Grüße
Klaus