使用Regex查找嵌套XML标记

Gug*_*ugg 4 html regex xml tags nested

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

我正在尝试查找所有嵌套标记,以下是我想要捕获的一些示例: <a><a></a></a>

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

所以用简单的英语我想要赶上所有 <a>其他人<a>而没有</a>介于他们之间..我想看整个字符串所以我应该继续,即使它看到一个换行符或换行符

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

Uni*_*ron 6

我希望你准备用正则表达式解析XML.


首先,让我们定义XML标签的样子!

<tag_name?(optional space (then whatever that doesnt end with "/"))>(whatever)</?(optional space)tag_name>
<tag_name?(optional space)/>
Run Code Online (Sandbox Code Playgroud)

要匹配其中一个标记,我们可以使用以下正则表达式:

/<[^ \/>]++ ?\/>|<([^ \>]++) ?[^>]*+>.*?<\/ ?\1>/s
Run Code Online (Sandbox Code Playgroud)

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

/<([^ \>]++) ?[^>]*+>.*?(?:<([^ \>]++) ?[^>]*+>.*?<\/ ?\2>|<[^ \/>]++ ?\/>).*?<\/ ?\1>/s
Run Code Online (Sandbox Code Playgroud)

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

/<([^ \>]++) ?[^>]*+>(.*?(?:<([^ \>]++) ?[^>]*+>(?:[^<]*+|(?2))<\/ ?\3>|<[^ \/>]++ ?\/>).*?)<\/ ?\1>/s
Run Code Online (Sandbox Code Playgroud)

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

不认真,试一试.

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

img http://gyazo.com/d1db416abf92b0123539c274386f9f31.png

干杯.