我有以下单元测试来检查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检查了模式,看起来没问题,但断言总是失败。我不明白为什么。
答案 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。