首先,我知道正则表达式不适合解析 xml,我真的应该使用 xml 解析器。也许我的问题是一个很好的例子,说明为什么这是真的。
话虽如此,我需要做的只是一次性搜索和替换一些 XML 文件。另外,我对正则表达式比较陌生,所以我希望更好地理解正则表达式,以及为什么它对 XML 来说是个坏主意。
我有以下 XML(原始文件在标签之间没有空格!):
<tag1>
<tag2>Doesn't matter what is here</tag2>
</tag1>
<tag1>
<tag2>Anything can <b>go<b> here</tag2>
<tag3>Hi there</tag3>
</tag1>
我需要将 tag3 内的“Hi there”拆分为两个部分,它们都包含在 tag1 中,并且如果存在 tag2 则具有相同的 tag2,即:
<tag1>
<tag2>Doesn't matter what is here</tag2>
</tag1>
<tag1>
<tag2>Anything can <b>go<b> here</tag2>
<tag3>Hi</tag3>
</tag1>
<tag1>
<tag2>Anything can <b>go<b> here</tag2>
<tag3>there</tag3>
</tag1>
我最初的想法是为 tag2 使用一个带有非贪婪量词的可选组,如下所示:
<tag1>(<tag2>.*?</tag2>)?<tag3>Hi there</tag3></tag1>
并替换为(Java 语法)
<tag1>$1<tag3>Hi</tag3></tag1><tag1>$1<tag3>there</tag3></tag1>
但是,那 。*?还是太贪心了;它从 tag1 的第一个开始到 tag1 的最后一个结束匹配。执行此操作的正确正则表达式方法是什么?或者这对正则表达式来说是一个难题?这是为什么对 XML 使用正则表达式是个坏主意的原因之一吗?
我发现使用原子组完全符合我的要求:
<tag1>(?>(<tag2>.*?</tag2>))?<tag3>Hi there</tag3></tag1>
但是我真的不明白为什么会这样。为什么这行得通,这是否足够可靠?