这是我在这里的第一篇文章,希望得到一些回应。我已经阅读了几篇类似的帖子,并且一致认为不要尝试使用正则表达式解析 xml/html,但我所要求的似乎比其他帖子上的更容易,所以我试一试。
我试图找到所有的嵌套标签,这里有一些我想捕捉的例子:
<a><a></a></a>
我不想抓
<a></a><a></a>
所以用简单的英语,我想抓住所有
<a>
其他人<a>
,而不需要</a>
在他们之间……我想看看整个字符串,所以即使看到换行符或换行符我也应该继续
希望能解决这个问题。谢谢大家!
我希望您已准备好使用正则表达式解析 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 文件片段,并用我的正则表达式进行了尝试,我.xml
从aliteralmind的问题中复制了一个 Maven 项目,并用我的正则表达式进行了尝试。最适用于重度嵌套元素。
(来源:gyazo.com)
干杯。
如果您想要一个 100% 正确的解决方案,例如一个适用于评论和 CDATA 部分以及内部/外部实体中的任意内容以及作者选择的命名空间前缀的解决方案,那么它不能使用正则表达式来完成。
而且由于使用 XSLT 很容易实现 100% 正确的解决方案,我认为您使用了错误的技术。
毫无疑问,如果您准备投入足够的工作,您可以使用正则表达式实现可接受的高命中率,但细节取决于您尚未明确说明的规范方面:例如,您想要做什么您找到的嵌套元素,以及是否要定位嵌套 3 深或 4 深的元素以及嵌套 2 深的元素。