Проблема в том, что это довольно неудобно для сравнения с регулярными выражениями, используемыми в lex
; если у вас есть система, которая поддерживает ERE, то вы сможете сделать либо:
<!\[CDATA\[(.*?)\]\]>
или
<!\[CDATA\[((?:[^]]|\](?!\]>))*)\]\]>
(В первом используются негладкие квантификаторы, во втором - отрицательные ограничения на просмотр. Хорошо, он также использует неотслеживающие парены, но вместо этого вы можете использовать их взятие; это не так важно.)
Вероятно, легче справиться с этим, используя стратегию, аналогичную способу обработки комментариев в стиле C в lex
, имея одно правило, совпадающее с началом CDATA (на <![CDATA[
) и помещающее лексер в отдельное состояние, которое он оставляет при просмотре ]]>
, собирая все промежуточные символы. Это поучительно по этой теме (и, похоже, это область, в которой flex
и lex
отличаются), и оно охватывает все стратегии, которые вы можете использовать, чтобы сделать эту работу.
Обратите внимание, что причина всех этих проблем заключается в том, что очень трудно написать правило с простыми регулярными выражениями, которое выражает тот факт, что жадное регулярное выражение должно соответствовать ]
, только если за ним не следует ]>
. Это гораздо проще сделать, если у вас есть только двухсимвольная (или односимвольная!) Последовательность конца интересного раздела, потому что вам не нужен такой сложный конечный автомат.