Java 删除xml文件的缩进

Java 删除xml文件的缩进,java,regex,removing-whitespace,Java,Regex,Removing Whitespace,我正在编写一个用于单元测试的函数。我想比较XML文件,但由于其中一个文件将由第三方库创建,因此我想减轻由于缩进不同而可能产生的差异。因此,我编写了以下函数: private String normalizeXML(String xmlString) { String res = xmlString.replaceAll("[ \t]+", " "); // leading whitespaces are inconsistent in the resulting xmls.

我正在编写一个用于单元测试的函数。我想比较XML文件,但由于其中一个文件将由第三方库创建,因此我想减轻由于缩进不同而可能产生的差异。因此,我编写了以下函数:

private String normalizeXML(String xmlString) {
    String res = xmlString.replaceAll("[ \t]+", " ");
    // leading whitespaces are inconsistent in the resulting xmls.
    res = res.replaceAll("^\\s+", "");
    return res.trim();
}
但是,此函数并没有删除XML每一行的前导间隔

当我以这种方式编写函数时(第一个正则表达式中的差异):

它确实删除了尾随的空白,但它也使xml显示为一行,这在需要比较差异时非常麻烦

我只是无法解释为什么第一个实现没有取代前导间隔。有什么想法吗

编辑:更有趣的是,如果我进行单行操作:

String res = xmlString.replaceAll("^\\s+", "");
此行不会删除任何标识

也许:

String res = xmlString.replaceAll("[ \\t]+", " ");
不是…

可能:

String res = xmlString.replaceAll("[ \\t]+", " ");

不是…

与其尝试操纵字符串表示,不如使用专用的XML比较工具(例如,它允许您准确定义哪些差异显著,哪些不显著)更安全。尝试使用正则表达式修改XML数据很少是一个好主意,您应该使用一个正确的XML解析器,它知道构成格式良好的XML的所有规则。

而不是试图操纵字符串表示,使用专用的XML比较工具会更安全,例如,它允许您准确定义哪些差异显著,哪些不显著。尝试使用正则表达式修改XML数据很少是一个好主意,您应该使用一个正确的XML解析器,它知道如何生成格式良好的XML的所有规则。

这一点对我很有用:

    private static String normalizeXMLs(String xmlString) {
    String res = xmlString.replaceAll("\\t", "");
    return res.trim();
}

祝你好运:)

这个对我来说很有用:

    private static String normalizeXMLs(String xmlString) {
    String res = xmlString.replaceAll("\\t", "");
    return res.trim();
}

祝你好运:)

不,我真的觉得第二个正则表达式奇迹般地停止了与第一个正则表达式的工作。不,我真的觉得第二个正则表达式奇迹般地停止了与第一个正则表达式的工作。谢谢你非常合理的评论并将我指向这个库。尽管如此,我还是认为我理解正则表达式。我不能让这种无法解释的行为继续下去。@BorisStrandjev在Java正则表达式
^
中默认只匹配输入的最开始部分。如果希望它也在字符串中嵌入换行符之后锚定,则需要启用“多行”标志:
replaceAll((?m^\\s+“,”)
现在,这是一个非常有用的答案!非常感谢。谢谢你的合理评论,并给我指出这个图书馆。尽管如此,我还是认为我理解正则表达式。我不能让这种无法解释的行为继续下去。@BorisStrandjev在Java正则表达式
^
中默认只匹配输入的最开始部分。如果希望它也在字符串中嵌入换行符之后锚定,则需要启用“多行”标志:
replaceAll((?m^\\s+“,”)
现在,这是一个非常有用的答案!非常感谢。这种方法的一个问题是,它可能会删除实际上很重要的空白。换行符和空格可以作为标记文本中的值出现。这种方法的一个问题是,它可能会删除实际上很重要的空白。可以在标记文本中显示为值的换行符和空格。