2014-10-30 47 views
-1

我有一个XML文档,我试图匹配完整标记,如果它包含sometextv2之内。这里的样本数据集,我有工作:正则表达式匹配具有特定文本的标记

<mm_reportitem> 
    <mm_file>file.cfm</mm_file> 
    <mm_displaystr><![CDATA[ <cfinvoke component="/sometextv2" ]]></mm_displaystr> 
</mm_reportitem> 
<mm_reportitem> 
    <mm_file>file.cfm</mm_file> 
    <mm_displaystr><![CDATA[ <cfinvoke component = "/sometext" ]]></mm_displaystr> 
</mm_reportitem> 
<mm_reportitem> 
    <mm_file>file.cfm</mm_file> 
    <mm_displaystr><![CDATA[ <cfinvoke component="sometextv2" ]]></mm_displaystr> 
</mm_reportitem> 

我用,我从几个不同的来源放在一起以下工作:

<mm_reportitem[^>]*>([\s\S]*?).*sometextv2.*([\s\S]*?)<\/mm_reportitem> 

这是相匹配的完整的标签,我想。但是,这似乎与sometextsometextv2都匹配。

我错过了什么,只有sometextv2获得匹配?

回答

0

与尝试:

<mm_reportitem>[\s\S]{10,200}sometextv2\"[\s\S]*?<\/mm_reportitem> 

我只是添加{} 10150,以避免在一个结果不止一个mm_reportitem。我认为这是一个正则表达式在这种奇怪的情况下太“贪婪”的问题...

+0

我能够修改这个以允许'mm_reportitem'节点中的属性,并使其完美工作。谢谢! – 2014-10-31 13:30:34

-1

你的正则表达式对我来说太复杂了。

<tag.*sometextv2.*</tag> 

适用于您发布的所有示例。那对你有用吗?

+0

我能够提供我正在使用的实际数据集。请看原文。我尝试了你的建议,但它不匹配。也许是由于标签内缺少新的线条? – 2014-10-30 21:12:20

+0

只需将它们加入即可... \ n。* \ n。* sometextv2。* \ n 从这里您可以根据需要使其更加严格或松懈。 – 2014-10-30 21:27:08

+0

按照你的例子,我在这里创建了一个测试用例。然而,我仍然没有得到匹配:http://regexr.com/39qt0 此外,在'',3,4等内可能有2个新行。它不是全部一致,所以明确定义新的在这种情况下,表达式中的行可能不可靠。 – 2014-10-30 21:35:49