Java Regex Matcher动态字符串的问题

时间:2011-07-09 08:20:27

标签: java regex pattern-matching string-formatting

我在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) {
  ...

我用打印检查了字符串,看起来没问题。

任何想法会发生什么?

2 个答案:

答案 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);