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

XML正则表达式搜索-查找特定的代码块,xml,regex,xml-parsing,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>S

我很难在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>
但我也得到了搜索结果中的第一个对象


我有圆点。要包含新行,就必须使用语法。

您最好不要使用正则表达式。有关不应使用正则表达式解析XML的原因,请参阅

一个简单得多的方法是使用

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


有支持C/C++、Java、.NET、javascript等的XML库。

不能保证正则表达式适用于所有场景。在某些情况下,它会失败。解析器保证在任何情况下都能工作。XPath就是您想要的。这是一个关于SO的日常话题,所以我将跳过讲道,尝试解决这个问题

我正在使用PCRE语法:

~<object>.*?</object>.*?(<object>.*?</object>)~s
您将需要s修饰符,以便。匹配换行符。您的第二个对象将在组1中捕获


这是未经测试的,但应该有效。

正则表达式,顾名思义,只能识别正则语言。正则语言遵循正则泵引理,该引理大致表示,在正则语言中超过一定大小的每个有效单词中,您将发现文本的一部分可以无限重复以生成更多的有效单词

然而,XML不是一种常规语言,它是一种语言。你可以用一个例子来证明这一点


上下文无关语言只能由上下文无关语法描述,并由上下文无关解析器LLk/LRk、CYK或Earley parser解析,所有这些解析器都会生成正则表达式无法生成的解析树。

即使您也得到了第一个对象,为什么不在执行regext之后从结果中删除它呢?点与换行符不匹配。使用xml解析器或xpath会更容易。@Tim可能没有使用.NET。你应该阅读其他大约一千篇关于使用正则表达式解析xml的文章,所有这些文章都至少包含一条评论,说不要尝试用正则表达式解析xml。使用XML解析器。。从问题文本右侧的相关列表中的任何一个开始。@KenWhite你知道为什么人们说你不应该用正则表达式解析XML吗?这是一个完美的答案。XPath是W3C推荐的在XML上运行查询的技术。给新鲜的一个漂亮的大绿色蜱!坏的正则表达式可能会失败,但坏的解析器也可能会失败。两者的完美实现将会成功。不同之处在于,解析器实现将以更少的代码、更少的压力和更少的错误空间达到完美。不,正则表达式总是会失败,不管您的实现有多好。您将向我展示任何假定正确解析XML片段的正则表达式,我将向您展示一段格式良好的XML片段,它将破坏XML片段。
//object[name="Summer"]
~<object>.*?</object>.*?(<object>.*?</object>)~s