我无法在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>
但我也在搜索结果中获得了第一个对象。
我有点(。)包含新行,因此语法。
答案 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解析器)解析,所有这些语法都生成一个正则表达式的解析树不能。