Xml CDATA的正则表达式是什么

Xml CDATA的正则表达式是什么,xml,regex,parsing,cdata,lex,Xml,Regex,Parsing,Cdata,Lex,嗨,我这里有一个示例CDATA <![CDATA[asd[f]]]> 及 我的CDATA正则表达式无法识别这一点 "<![CDATA["([^\]]|"]"[^\]]|"]]"[^>])*"]]>" “” 这也不行 "<![CDATA["[^\]]*[\]]{2,}([^\]>][^\]]*[\]]{2,})*">" “” 谁能给我一个正则表达式,我需要在Lex/Flex中使用它 :我已经回答了这个问题,请投票表决我的答案,谢谢。

嗨,我这里有一个示例CDATA

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


我的CDATA正则表达式无法识别这一点

"<![CDATA["([^\]]|"]"[^\]]|"]]"[^>])*"]]>"
“”
这也不行

"<![CDATA["[^\]]*[\]]{2,}([^\]>][^\]]*[\]]{2,})*">"
“”
谁能给我一个正则表达式,我需要在Lex/Flex中使用它

:我已经回答了这个问题,请投票表决我的答案,谢谢。

我相信可能会有所帮助,即使他们正在获取HTML内容,并且是.NET

在同一个问题中,还有其他的答案,其中包括各种获取CDATA的选项

乍得的答复:

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

不管怎样。

很简单,应该是这样的:

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


至少

问题在于,这与
lex
中使用的正则表达式类型相匹配相当困难;如果您有一个支持ERE的系统,那么您可以执行以下任一操作:

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

)*)\]\]>
(第一个使用非贪婪量词,第二个使用负前瞻约束。好的,它也使用非捕获参数,但您可以在那里使用捕获参数;这并不重要。)

通过使用类似于在
lex
中处理C风格注释的策略,通过使用一条规则来匹配CDATA的开头(在
上),并将lexer置于一个单独的状态,在查看
]>
时离开,同时收集中间的所有字符,可能更容易处理此问题。在这个主题上很有启发性(这似乎是
flex
lex
不同的领域),它涵盖了您可以采取的所有策略,以使这项工作发挥作用


请注意,所有这些问题的原因都是因为很难用简单的正则表达式编写规则来表示这样一个事实,即贪婪正则表达式必须只匹配一个
]
,如果它后面没有
]>
。如果您在有趣的部分序列中只有两个字符(或一个字符!)的结尾,则更容易操作,因为您不需要如此复杂的状态机。

一个注释-搜索CDATA也应该排除注释,CDATA可以嵌入。
//sg


这可以通过检查组1在全局搜索中返回的每个匹配时是否有效来实现。

这就是解决方案。我们需要使用开始状态的原因是,在
]]>
之间的任何一个状态都不会与其他正则表达式匹配

%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();
}
%选项noyywrap
%x CDATA
%%
"" { 
printf(“CDATA结束\n”);
开始首字母;
}
%%
main()
{
yylex();
}
)\s*)*\]\]>


刚才修改的Previous答案

已全部尝试。不在FlexIt中编译如果我这样做,它将不起作用。Chad的正则表达式将CDATA识别为单个CDATA,而不是两个。我需要两个CDATA@Freddy:我假设您的内容在字符串中包含
]]>
,需要转义吗?否则,这与CDATA的使用方式不一致。主要问题是,如果我有这样的东西。上述正则表达式不识别2CDATA@Freddy:如果使用正则表达式解析XML文档,将会出现很多问题。XML解析器已经处理CDATA并从中提取内容。如果这是您正在做的其他事情(我并不假装完全熟悉flex),您应该能够使用全局匹配或背对背匹配来获得可能存在的多个结果。很难说您是否逃脱了正确的布雷基特。xml规范还指出了在//s
之后的第一个]]>“
在该区域的任何地方……为什么不使用XML解析器并处理DOM树或类似SAX的事件流呢?我很乐意这样做,但我得到的文档不是严格意义上的XML文档。主要问题是,如果我有这样的文档。上述正则表达式不识别2CDATA@Freddy不,当然不是,那太糟糕了。如果你想找到一件事的多个实例,你需要重复你的搜索。正如您在这里看到的:它将找到多个实例,但不是一次找到所有实例我们不能使用flex;它的manual()没有将非贪婪匹配(或前瞻断言,另一种选择)列为允许的语法。你需要具备启动条件才能做好工作。@Donal什么?我以为ActionScript是从JavaScript方言开始的。“他们让它变得不那么强大了吗?”桑帕科问道?是非贪婪算子。如果您有多个部分,差异将非常明显。如果没有?,它将选择从第一节开始到最后一节结束的所有内容。顺便说一句,上面的两个REs对于像
这样的示例文本很好,这是一个很好的压力测试,用于检查这些模式是否真的与所需的完全匹配。是的,我认为您非常理解我的问题。单个正则表达式似乎不足以捕获所有可能的CDATA。因此,我希望有人能给我一些关于如何使用flex/lex捕获CDATA的指导,最好不要使用yacc或bison。@Freddy:好的,请阅读我链接的页面。这是关于匹配C注释的问题,但它在这里也同样适用。至少
)*)\]\]>
对@Brad不起作用:当然不起作用。Flex不支持ERE。如果你读过我写的其他东西,你就会知道这件事了…@Freddy Chua-它做了它应该做的事,所以我想它是有效的。试着改变(?:只是(
<!\[CDATA\[.*?\]\]>
<!\[CDATA\[(.*?)\]\]>
<!\[CDATA\[((?:[^]]|\](?!\]>))*)\]\]>
%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();
}
<!\[CDATA\[\s*(?:.(?<!\]\]>)\s*)*\]\]>