Das Problem ist, dass dies eher umständlich ist mit der Art von regulären Ausdrücken in lex
verwendet entsprechen; wenn Sie ein System hatte die EREs unterstützt, dann würden Sie in der Lage sein, entweder zu tun:
<!\[CDATA\[(.*?)\]\]>
oder
<!\[CDATA\[((?:[^]]|\](?!\]>))*)\]\]>
(Die erste nutzt nicht gierige Quantoren, die zweite verwendet negative Vorschau Einschränkungen. OK, es verwendet auch nicht-erfassende Paren, aber Sie können stattdessen Captures verwenden, das ist nicht so wichtig.)
Es ist wahrscheinlich einfacher, dies zu handhaben, indem Sie eine ähnliche Strategie wie in C-style-Kommentaren behandelt werden lex
, indem Sie eine Regel haben, um die st Kunst der CDATA (unter <![CDATA[
) und lege den Lexer in einen separaten Zustand, den er beim Sehen ]]>
verlässt, während er alle Zeichen dazwischen sammelt. This ist lehrreich zu diesem Thema (und es scheint, dass dies ein Bereich ist, wo flex
und lex
unterscheiden) und es deckt alle Strategien ab, die Sie ergreifen können, um diese Arbeit zu machen.
Beachten Sie, dass all diese Probleme darauf zurückzuführen sind, dass es sehr schwierig ist, eine Regel mit einfachen regulären Ausdrücken zu schreiben, die die Tatsache ausdrückt, dass ein gieriger regulärer Ausdruck nur ]
entspricht, wenn nicht ]>
folgt. Es ist viel einfacher zu tun, wenn Sie nur eine Zwei-Zeichen- (oder Einzelzeichen!) Ende-von-interessante-Abschnitt-Sequenz haben, weil Sie solch eine ausgeklügelte Zustandsmaschine nicht brauchen.
Es ist schwer zu sagen, nur geändert, wenn Sie die richtigen breckets entkommen. Auch die XML-Spezifikation sagt die erste]]> nach /s' – sln
Sie wollen' '' nirgends in diesem RE verwenden. –
Und ... warum nicht einfach einen XML-Parser verwenden und entweder mit einer DOM-Struktur oder einem SAX-ähnlichen Ereignisstrom arbeiten? –