string.matches («. *») возвращает false

20

В моей программе у меня есть строка (полученная из внешней библиотеки), которая не соответствует никакому регулярному выражению.

String content = // extract text from PDF
assertTrue(content.matches(".*")); // fails
assertTrue(content.contains("S P E C I A L")); // passes
assertTrue(content.matches("S P E C I A L")); // fails

Любая идея, что может быть неправильным? Когда я печатаю content в stdout, он выглядит нормально.

Вот код для извлечения текста из PDF (я использую iText 5.0.1):

PdfReader reader = new PdfReader(source);
PdfTextExtractor extractor = new PdfTextExtractor(reader,
    new SimpleTextExtractingPdfContentRenderListener());
return extractor.getTextFromPage(1);
  • 0
    отмечен как любимый, так как я не первый раз был поражен такой Java-бомбой.
Теги:

1 ответ

33
Лучший ответ

По умолчанию . не соответствует разрыву строк. Поэтому я предполагаю, что ваш content содержит разрыв строки.

Также обратите внимание, что matches будет соответствовать всей строке, а не только ее части: она не делает то, что contains делает!

Некоторые примеры:

String s = "foo\nbar";
System.out.println(s.matches(".*"));       // false
System.out.println(s.matches("foo"));      // false
System.out.println(s.matches("foo\nbar")); // true
System.out.println(s.matches("(?s).*"));   // true

(?s) в последнем примере приведет к тому, что . будет соответствовать разрыву строк. Таким образом, (?s).* будет соответствовать любой строке.

  • 1
    Вы спасли мой день :) Я не понял, что match () хочет соответствовать всей строке.
  • 1
    @Miroslav, да, ошибку легко допустить, так как многие языки «ищут» совпадение, а не сопоставляют всю строку. Рад слышать, что вы решили это!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню