我在Java和动态输入方面遇到了Regex的一些问题 - Regex完全没问题;)
private static Pattern START_SUITE = Pattern.compile("Test Suite '(\\S+)'.*started at\\s+(.*)");
String line = "Test Suite '/a/long/path/to/some/file.octest(Tests)' started at 2011-07-09 08:01:34 +0000";
Matcher m = START_SUITE.matcher(line);
if (m.matches) {
//do something
}
这对我的测试java应用程序和上面的字符串工作正常。 但是当String确实来自其他来源时,Matcher与它不匹配。
processHandler.addProcessListener(new ProcessAdapter() {
@Override
public void onTextAvailable(final ProcessEvent event, final Key outputType) {
try {
outputParser.myMatchStringFunction(event.getText());
}
...
}
public void myMatchStringFunction(String line) {
Matcher m = START_SUITE.matcher(line);
if (m.matches) {
...
我用打印检查了字符串,看起来没问题。
任何想法会发生什么?
答案 0 :(得分:3)
字符串是来自字符串文字还是来自输入的动态不会影响任何内容。所以你的正则表达式出了问题,或者你的输入中有些东西是你没想到的,需要修剪掉。
你说你已经打印过字符串 - 但很容易错过不可打印的字符或换行符等。
我建议您完整打印一个示例失败字符串,包括Unicode字符值,例如
for (int i = 0; i < text.length(); i++)
{
char c = text.charAt(i);
System.out.println("Position: " + i + "Character: " + c
+ " Unicode: " + (int) c);
}
然后,如果需要,您将能够将完全该字符串放入您的代码中,并且您可能只需通过以该形式检查它就能发现错误。
答案 1 :(得分:1)
感谢您的提示。
在每个模式的末尾添加DOTALL和(。*)解决了问题
private static Pattern START_SUITE = Pattern.compile("Test Suite '(\\S+)'.*started at\\s+(.*)", Pattern.DOTALL);