正则表达式,替换标记内的空格

时间:2013-09-30 13:09:02

标签: java regex

我有一个不正确的xml字符串,我想构建一个正确的

<root val="yyy">
    <fol der val="attribute 1">myfolder</folder>
</root>

问题是标签内的空白区域:“fol der”。 可以替换&lt;内部的空白区域。 &GT;在java中使用正则表达式的标签(但不是内部属性)? 感谢所有

3 个答案:

答案 0 :(得分:2)

我会使用(?<=[<]\w*)\s+,但java的正则表达式引擎不支持lookbehind中的量词..

如果有多个空格,则必须这样做。

Matcher m=Pattern.compile("(?<=[<])(/?)\\s*(\\w*)\\s+(?!\\w+\\s*=)").matcher(xml);
while(m.find())
{
    xml=m.replaceAll("$1$2");
    m.reset(xml);   
}

虽然这不适用于属性名称

答案 1 :(得分:0)

可能不是你想听到的,但这是解决错误问题的错误工具。经验法则是,不要尝试使用正则表达式自己解析/处理XML文件。如果您的XML不正确/无效,那么您应该与提供它的人解决问题,而不是如何解决它。

答案 2 :(得分:0)

如果您的XML是这样的:

<root val="yyy">
    <fo l der val="attribute 1">myfol d er</folder>
</root>

以下应该工作:

final Pattern p = Pattern.compile("(?s)(?<=<).*?(?=/?>|\\s*\\w+\\s*=)");
Matcher m = p.matcher(data); // your XML
StringBuffer sb = new StringBuffer();
while (m.find()) {
    m.appendReplacement(sb, m.group().replace(" ", ""));
}
m.appendTail(sb);
data = sb.toString();
System.out.println(data);

<强>输出:

<root val="yyy">
    <folder val="attribute 1">myfol d er</folder>
</root>

现场演示:http://ideone.com/TIrsQR