编辑: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,我会遇到所有“不要这样做”的问题。我已阅读其他主题。我正在寻找针对特定黑客的特定帮助。
不要使用正则表达式来修复/解析/处理标记语言。 请阅读此处原因。
使用像tidy这样的宽容解析器,通过几个简单的步骤来阅读和修复文档。有一个 Java 库 (jtidy) 您可以使用。
好的,鉴于您的限制,您可以:
搜索
<tag attr1\s*=\s*([^" >]+)
并替换为
<tag attr1 = "\1"
所以,在 Java 中,这可能是(根据 RegexBuddy):
String resultString = subjectString.replaceAll("<tag attr1\\s*=\\s*([^\" >]+)", "<tag attr1 = \"$1\"");
编辑:进一步简化正则表达式。
此解决方案包装第一次出现的未加引号的属性值,即使它位于其他正确引用的属性(或第一个或最后一个属性)之间:
<a id="a2" href=https://twitter.com/nlm_nih class="ff">
变成:
<a id="a2" href="https://twitter.com/nlm_nih" class="ff">
final String SPACE = " \r\n";
final String ATTNAME_PATTERN = "[a-z]+(?:[-][a-z]+)*";
// Remove any spaces before and after = (simplifies next regex)
String wrappedAtts = targetHtml.replaceAll("[" + SPACE + "]*=[" + SPACE + "]*", "=");
wrappedAtts = wrappedAtts.replaceAll("([<][a-z]+(?:[" + SPACE + "]+" + ATTNAME_PATTERN + "[=][\"][^\"]*[\"])*)[" + SPACE + "]+(" + ATTNAME_PATTERN + ")=([^\"][^" + SPACE + "]+)", "$1 $2=\"$3\"");
如果您需要处理标签中的多次出现,只需将最后一行放入循环中并迭代,直到找不到更多内容为止。