4

这是我在这里的第一篇文章,希望得到一些回应。我已经阅读了几篇类似的帖子,并且一致认为不要尝试使用正则表达式解析 xml/html,但我所要求的似乎比其他帖子上的更容易,所以我试一试。

我试图找到所有的嵌套标签,这里有一些我想捕捉的例子: <a><a></a></a>

我不想抓 <a></a><a></a>

所以用简单的英语,我想抓住所有 <a>其他人<a>,而不需要</a>在他们之间……我想看看整个字符串,所以即使看到换行符或换行符我也应该继续

希望能解决这个问题。谢谢大家!

4

2 回答 2

7

我希望您已准备好使用正则表达式解析 XML。


首先,让我们定义 XML 标记的外观!

<tag_name␣(optional space (then whatever that doesnt end with "/"))>(whatever)</␣(optional space)tag_name>
<tag_name␣(optional space)/>

为了匹配这些标签之一,我们可以使用以下正则表达式:

/<[^ \/>]++ ?\/>|<([^ \>]++) ?[^>]*+>.*?<\/ ?\1>/s

显然,没有标签会嵌套在我们的第二种 XML 标签中。所以我们的两级嵌套正则表达式将是:

/<([^ \>]++) ?[^>]*+>.*?(?:<([^ \>]++) ?[^>]*+>.*?<\/ ?\2>|<[^ \/>]++ ?\/>).*?<\/ ?\1>/s

现在让我们应用一些递归魔法(希望您的正则表达式引擎支持递归(并且还没有崩溃)):

/<([^ \>]++) ?[^>]*+>(.*?(?:<([^ \>]++) ?[^>]*+>(?:[^<]*+|(?2))<\/ ?\3>|<[^ \/>]++ ?\/>).*?)<\/ ?\1>/s

完成 - 正则表达式应该做。

不认真,试试看。

我从 w3schools XML 教程中偷了一个 XML 文件片段,并用我的正则表达式进行了尝试,我.xmlaliteralmind的问题中复制了一个 Maven 项目,并用我的正则表达式进行了尝试。最适用于重度嵌套元素

图像
(来源:gyazo.com

干杯。

于 2014-07-31T13:30:12.377 回答
2

如果您想要一个 100% 正确的解决方案,例如一个适用于评论和 CDATA 部分以及内部/外部实体中的任意内容以及作者选择的命名空间前缀的解决方案,那么它不能使用正则表达式来完成。

而且由于使用 XSLT 很容易实现 100% 正确的解决方案,我认为您使用了错误的技术。

毫无疑问,如果您准备投入足够的工作,您可以使用正则表达式实现可接受的高命中率,但细节取决于您尚未明确说明的规范方面:例如,您想要做什么您找到的嵌套元素,以及是否要定位嵌套 3 深或 4 深的元素以及嵌套 2 深的元素。

于 2013-08-10T21:27:41.000 回答