Ich habe Teile von Zeichenketten in eckigen Klammern, etwa so:
[p1 text1/label1] [p2 text2/label2] [p3 text3/label3] [...
und so weiter.
Was sich in den einzelnen Chunks befindet, ist nicht wichtig. Aber manchmal gibt es Textabschnitte, die NICHT von eckigen Klammern umgeben sind. Zum Beispiel:
[p1 text1/label1] [p2 text2/label2] textX/labelX [p3 text3/label3] [...] textY/labelY textZ/labelZ [...]
Ich dachte, ich hätte das mit Regex in Perl gut gelöst, bis mir klar wurde, dass ich nur die Fälle berücksichtigt habe, in denen ein einziger fehlerhafter Text am Anfang, in der Mitte oder am Ende des Textes steht, nicht aber die Fälle, in denen wir zwei fehlerhafte Texte zusammen haben. (wie die Y- und Z-Blöcke oben).
Also habe ich festgestellt, dass reguläre Ausdrücke in Perl nur das erste übereinstimmende Muster abfangen? Wie könnte das obige Problem dann gelöst werden?
Edita:
Das Problem besteht darin, sicherzustellen, dass alle sollte sein von Klammern umgeben. Eckige Klammern sind niemals rekursiv. Wenn eine Phrase mit Klammern umgeben ist, hängt der p-Wert vom "label"-Wert ab. Wenn z. B. eine nicht eingeklammerte Phrase lautet
li/IN
dann sollte es sich in:
[PP li/IN]
Ich schätze, es ist eine Mischung, aber die einzige Möglichkeit, die ich mir vorstellen kann, um das größere Problem zu lösen, an dem ich arbeite, ist, sie alle in Klammerausdrücke zu verwandeln, damit die Handhabung einfacher ist. Es funktioniert also, wenn eine Phrase ohne Klammern am Anfang, in der Mitte und am Ende vorkommt, aber nicht, wenn zwei oder mehr zusammen vorkommen.
Ich habe grundsätzlich für jede Position (Anfang, Mitte und Ende) eine andere Regex verwendet. Die Regex, die eine Phrase ohne Klammern in der Mitte abfängt, sieht so aus:
$data =~ s/\] (text)#\/label \[/\] \[selected-p-value $1#\/label\] \[/g;
Ich stelle also nur fest, dass, wenn ein ] vor und nach dem Text/Label-Muster steht, dieses keine Klammern hat. Ich mache etwas Ähnliches auch für die anderen. Aber ich schätze, das ist unglaublich un-generisch. Meine Regex ist nicht toll!