Java Regex Matcher Задача с динамическими строками - PullRequest
0 голосов
/ 09 июля 2011

У меня есть некоторые проблемы с Regex в Java и динамическим вводом - вообще никаких проблем с 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-приложением с приведенной выше строкой. Но когда строка поступает из другого источника, 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 ]

3 голосов
/ 09 июля 2011

Независимо от того, была ли строка получена из строкового литерала или динамически из ввода, это ни на что не повлияет. Так что это или что-то не так с вашим регулярным выражением, или что-то в вашем вводе, что вы не ожидали и должны быть обрезаны.

Вы говорите, что напечатали строку - но легко пропустить непечатные символы или символы новой строки и т. Д.

Я предлагаю вам напечатать образец неудачной строки полностью, включая значения символов 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 голос
/ 09 июля 2011

Спасибо за подсказку.

Добавление DOTALL и (. *) В конце каждого шаблона решило проблему

private static Pattern START_SUITE = Pattern.compile("Test Suite '(\\S+)'.*started at\\s+(.*)", Pattern.DOTALL);
...