正则表达式无法匹配行首的空格

时间:2015-02-09 10:48:04

标签: java regex

我有以下单元测试来检查XML行开头的缩进:

private static final String REGEX_PATTERN = "^\\s+";

@BeforeTest
@Parameters("unformattedXmlFile")
public void setup(String unformattedXmlFile) throws TransformerException, ParserConfigurationException, InstantiationException, IllegalAccessException, ClassNotFoundException {
    EditXmlPanel panel = new EditXmlPanel();
    try {
        String unformatted = readFile(unformattedXmlFile);
        String formatter = panel.prettyFormat(unformatted);         
        String [] lines = formatter.split("\n");

        for(int i=0; i < lines.length; i++) {
            System.out.println(lines[i]);
            if(i !=0 && i !=lines.length -1) {                  
                //Assert.assertEquals((Character.isWhitespace(lines[i].charAt(0))), true);
                Assert.assertEquals(lines[i].matches(REGEX_PATTERN), true);
            }
        }           

    } catch (IOException e) {
        Assert.fail("Unable to read file: " + e.getMessage(), e);
    }

}

我读了一个未格式化的XML文件 - 没有缩进 - 然后通过一个函数运行它来打印它,就像 - 缩进它一样。然后我的单元测试检查每行开始时的缩进。因此,缩进的行可能如下所示:

         <message code="272" coeMsgName="CCR_I-Credit-Control-Initial" endtoend="AUTO" error="false" hopbyhop="AUTO" proxiable="true" request="true" retransmit="false">

我的正则表达式是:

^\\s+

因此,在行的开头匹配任意数量的空格。我已经使用regexr.com检查了模式,看起来没问题,但断言总是失败。我不明白为什么。

2 个答案:

答案 0 :(得分:2)

你的正则表达式必须是:

private static final String REGEX_PATTERN = "\\s+.*";

因为String.matches尝试将整行与正则表达式匹配,否则返回false。

PS:由于同样的原因,您的正则表达式中不需要使用锚点^$

答案 1 :(得分:0)

在声明中:lines[i].matches(REGEX_PATTERN)您将^\\s+整个行匹配。

所以你的行是由所有空格组成的,否则你的断言就会失败。

您可以使用Pattern / Matcher惯用法,也可以使用与整行匹配的更广泛模式调用String.matches

请参阅String#matches API here