XML正则表达式搜索 - 查找特定的代码块

时间:2013-10-23 15:38:44

标签: xml regex xml-parsing

我无法在XML文件中查找特定的代码块。

XML与此示例类似:

<object>
   <class>File</class>
   <name>Fall</name>
<desc>Description of Seasons: Fall</desc>
</object>

<object>
   <class>File</class>
   <name>Summer</name>
<desc>Description of Seasons: Summer</desc>
</object>

<object>
   <class>Image</class>
   <name>Summer1</name>
<desc>Image of Seasons: Summer</desc>
</object>

<object>
   <class>File</class>
   <name>Weather3</name>
<desc>Description of Weather</desc>
</object>

基本上我希望正则表达式只返回名为Summer的第二个对象。

我该怎么做?

我被困在这里:

<object>(.*?)<class>File</class>(.*?)Description of Seasons: Summer(.*?)</object>

但我也在搜索结果中获得了第一个对象。

我有点(。)包含新行,因此语法。

3 个答案:

答案 0 :(得分:3)

最好不要使用正则表达式。请参阅here,了解正则表达式不应用于解析XML的正当理由。

更简单的方法是使用XPath例如

//object[name="Summer"]

如果您将此XPath表达式应用于XML(假设您将格式错误的XML包含在根标记中),那么它只会选择“名为Summer的第二个对象”。

有XML库支持XPath in most if not all programming languages(C / C ++,Java,.NET,javascript等)。

答案 1 :(得分:0)

无法保证正则表达式适用于所有方案。有些情况会失败。无论如何,保证解析器适用于每个场景。 XPath就是你想要的。这是关于SO的日常话题,所以我将跳过布道并尝试解决问题。

我正在使用PCRE语法:

~<object>.*?</object>.*?(<object>.*?</object>)~s

您需要s修饰符,以便.与换行符匹配。您的第二个对象将在小组#1中捕获。

这是未经测试但应该有用。

答案 2 :(得分:0)

正则表达式,顾名思义,只能识别常规语言。常规语言遵循常规抽象引理,其中(粗略地)指出,在超出一定大小的常规语言的每个有效单词中,您将找到可无限重复的文本的一部分以产生更有效的单词。

然而,

XML不是常规语言,而是CF language。 (您可以通过applying the pumping lemma证明这一点。)

无上下文语言只能通过无上下文语法描述,并由无上下文解析器(LL(k)/ LR(k),CYK或Earley解析器)解析,所有这些语法都生成一个正则表达式的解析树不能。