Ich habe Schnipsel von Zeichenfolgen innerhalb von eckigen Klammern, so wie hier:
[p1 text1/label1] [p2 text2/label2] [p3 text3/label3] [...
und so weiter.
Was sich innerhalb jedes Schnipsels befindet, ist nicht wichtig. Aber manchmal gibt es einzelne Textschnipsel, 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 Problem bereits mit Regex in Perl gelöst, bis ich feststellte, dass ich nur die Fälle abgedeckt habe, in denen am Anfang, in der Mitte oder am Ende des Textes ein einzelner unpassender Text steht, aber nicht, wenn zwei unpassende Texte zusammenkommen. (wie die Y und Z Schnipsel oben).
Also habe ich festgestellt, dass reguläre Ausdrücke in Perl nur das erste übereinstimmende Muster erkennen? Wie könnte das obige Problem dann gelöst werden?
Bearbeiten:
Das Problem besteht darin sicherzustellen, dass alles von eckigen Klammern umgeben sein sollte. Eckige Klammern sind niemals rekursiv. Wenn ein Satz mit eckigen Klammern umgeben wird, hängt der Wert des p-Werts vom "Label"-Wert ab. Wenn zum Beispiel ein unpassender Textschnipsel ist
li/IN
dann sollte es sich in folgendes verwandeln:
[PP li/IN]
Ich denke, es ist eine Mischung, aber der einzige Weg, den ich kenne, um das größere Problem zu lösen, an dem ich arbeite, besteht darin, alle in eckige Klammern umschlossenen Sätze zu wandeln, um die Bearbeitung zu erleichtern. Ich habe es also geschafft, wenn ein nicht in eckige Klammern eingeschlossener Satz am Anfang, in der Mitte und am Ende vorkommt, aber nicht, wenn zwei oder mehr zusammenkommen.
Im Grunde habe ich für jede Position (Anfang, Mitte und Ende) einen anderen Regex verwendet. Derjenige, der einen nicht in eckige Klammern eingeschlossenen Satz in der Mitte erfasst, sieht so aus:
$data =~ s/\] (text)#\/label \[/\] \[selected-p-value $1#\/label\] \[/g;
Also, was ich mache, ist einfach festzustellen, dass, wenn ein ] vor und nach dem text/label-Muster steht, dieser keinen Klammern hat. Ich mache etwas Ähnliches auch für die anderen. Aber ich denke, das ist unglaublich unspezifisch. Mein Regex ist nicht optimal!