用于引用不带引号的XML属性的正则表达式

时间:2010-02-11 17:46:28

标签: java xml regex

编辑:100%正确的理论是你根本不想这样做。但是我已经接受了最有帮助的答案。

所以我从一个承诺修复它的客户端获得了丑陋的XML。与此同时,我需要自己清理它。我正在寻找一个在Java中使用的正则表达式来添加不带引号的属性的引号。一般情况更好,但到目前为止,只有一个属性被破坏,因此正则表达式可以专门引用“attr1”。该属性的值是未知的,因此我无法在搜索中包含该值。

<tag attr1 = VARIABLETEXT>
<tag attr1 = "VARIABLETEXT">not quoted</tag>
<tag attr1 = VARIABLETEXT attr2 = "true">
<otherTag>buncha junk</otherTag>
<tag attr1 = "VARIABLETEXT">"quoted"</tag>

应该变成

<tag attr1 = "VARIABLETEXT">
<tag attr1 = "VARIABLETEXT">not quoted</tag>
<tag attr1 = "VARIABLETEXT" attr2 = "true">
<otherTag>buncha junk</otherTag>
<tag attr1 = "VARIABLETEXT">"quoted"</tag>
编辑:非常感谢你告诉我不要做我想做的事情。然而,这不是一些随机的,任何事情都是XML,我会遇到所有“不要做”的问题。我已经读过其他帖子了。我正在寻找特定黑客的具体帮助。

2 个答案:

答案 0 :(得分:5)

不要使用正则表达式来修复/解析/处理标记语言。 Read here why.

使用像tidy这样宽容的解析器,只需几个简单的步骤即可阅读和修复文档。您可以使用Java library (jtidy)

答案 1 :(得分:2)

好的,鉴于你的约束,你可以:

搜索

<tag attr1\s*=\s*([^" >]+)

并替换为

<tag attr1 = "\1"

所以,在Java中,可能是(根据RegexBuddy):

String resultString = subjectString.replaceAll("<tag attr1\\s*=\\s*([^\" >]+)", "<tag attr1 = \"$1\"");

编辑:简化正则表达式。