2010-03-07 11 views
21

W moim programie mam ciąg (uzyskany z zewnętrznej biblioteki), który nie pasuje do żadnego wyrażenia regularnego.string.matches (". *") Zwraca fałsz

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 

Każdy pomysł, co może być nie tak? Kiedy wypiszę content na standardowe wyjście, wszystko wygląda dobrze.

Oto kod do wydobywania tekstu z PDF (używam iText 5.0.1):

PdfReader reader = new PdfReader(source); 
PdfTextExtractor extractor = new PdfTextExtractor(reader, 
    new SimpleTextExtractingPdfContentRenderListener()); 
return extractor.getTextFromPage(1); 
+0

oznaczone jako ulubione, ponieważ nie pierwszy raz zostałem trafiony przez taką bombę java. –

Odpowiedz

33

Domyślnie . nie pasuje podziały wiersza. Zgaduję więc, że Twój content zawiera podział wiersza.

Należy również pamiętać, że dopasuje cały ciąg, a nie tylko jego część: nie robi to, co robi contains!

Kilka przykładów:

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) w ostatnim przykładzie spowoduje . dopasować linię łamie również. Tak więc (?s).* dopasuje dowolny ciąg.

+1

Uratowałeś mój dzień :) Nie zdawałem sobie sprawy, że matches() chce dopasować cały ciąg. –

+1

@Miroslav, tak, błąd można łatwo popełnić, ponieważ wiele języków "szuka" dopasowania zamiast dopasowywania całego ciągu znaków. Dobrze słyszeć, że to rozwiązałeś! –

Powiązane problemy