什么是CDATA的正则表达式

时间:2011-01-06 15:29:16

标签: xml regex parsing cdata lex

您好我在这里有一个示例CDATA

<![CDATA[asd[f]]]>

<tag1><![CDATA[asd[f]]]></tag1><tag2><![CDATA[asd[f]]]></tag2>

我的CDATA正则表达式无法识别此

"<![CDATA["([^\]]|"]"[^\]]|"]]"[^>])*"]]>"

这也不起作用

"<![CDATA["[^\]]*[\]]{2,}([^\]>][^\]]*[\]]{2,})*">"

有人请给我<![CDATA[asd[f]]]>的正则表达式,我需要在Lex / Flex中使用它

:我已经回答了这个问题,请对我的回答进行投票,谢谢。

6 个答案:

答案 0 :(得分:7)

很简单,应该是这样的:

<!\[CDATA\[.*?\]\]>

至少it works on regexpal.com

答案 1 :(得分:3)

答案 2 :(得分:2)

这是解决方案。我们需要使用START STATE的原因是,<!CDATA[]]>之间的任何内容都无法与其他REGEX匹配。

%option noyywrap
%x CDATA

%%
"<![CDATA[" { BEGIN CDATA; printf("Entering CDATA\n"); }
<CDATA>([^\]]|\n)*|.    { printf("In CDATA: %s\n", yytext); }
<CDATA>"]]>" { 
    printf("End of CDATA\n");
    BEGIN INITIAL;
}

%%
main()
{
    yylex();
}

答案 3 :(得分:0)

我相信this other SO answer可能会有所帮助,即使它们正在抓取HTML内容并且是.NET。

在同一个问题中,还有其他各种选择可以获取CDATA。

CHAD回答:

<!\[CDATA\[(.*?)\]\]>

匹配:

<![CDATA[asd[f]]]>

检索:

asd[f]

根据FlexRegEx无论如何。

答案 4 :(得分:0)

答案 5 :(得分:0)

<!\[CDATA\[\s*(?:.(?<!\]\]>)\s*)*\]\]>

以前的答案刚刚修改