我有一个通过REST调用得到的xml字符串。但是,某些属性的值已损坏。例如:
<property name="foo" value="Some corrupted String because of "something" like that"/>
如何使用单引号替换前面没有 value = 或不跟 /&gt; 的双引号,并从中获取有效的XML字符串在Java 6中损坏了一个?
编辑:
我试图修改用于VisualBasic的这个lookahead / lookbehind正则表达式。但是由于逃避字符的不兼容性,我想,我无法创建它的Java版本。这是:
(?<=^[^""]*""(?>[^""]*""[^""]*"")*[^""]*)"(?! \s+ \w+=|\s* [/?]?" >)|(?<!\w+=)""(?=[^""]*""(?>[^""]*""[^""]*"")*[^""]*$)
答案 0 :(得分:2)
您可以使用以下正则表达式:
\s+[\w:.-]+="([^"]*(?:"(?!\s+[\w:.-]+="|\s*(?:\/?|\?)>)[^"]*)*)"
见regex demo。它会将捕获后者的任何属性名称/值对匹配到我们可以在回调中更改的组1中。
String s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <resources> <resource> <properties> <property name=\"name\" value=\"retrieveFoo\"/>\n<property name=\"foo\" value=\"Some corrupted String because of \"something\" like that\"/>";
StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile("(\\s+[\\w:.-]+=\")([^\"]*(?:\"(?!\\s+[\\w:.-]+=\"|\\s*(?:/?|\\?)>)[^\"]*)*)\"").matcher(s);
while (m.find()) {
m.appendReplacement(result, m.group(1) + m.group(2).replace("\"", """) + "\"");
}
m.appendTail(result);
System.out.println(result.toString());
输出:
<?xml version="1.0" encoding="UTF-8"?> <resources> <resource> <properties> <property name="name" value="retrieveFoo"/>
<property name="foo" value="Some corrupted String because of "something" like that"/>