2010-03-07 57 views
21

Trong chương trình của tôi, tôi có một chuỗi (thu được từ thư viện bên ngoài) không khớp với bất kỳ cụm từ thông dụng nào.string.matches (". *") Trả về false

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 

Bất kỳ ý tưởng nào có thể sai? Khi tôi in content để stdout, có vẻ ok.

Đây là đoạn mã để trích xuất văn bản từ PDF (Tôi đang sử dụng iText 5.0.1):

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

được đánh dấu là yêu thích vì đây không phải là lần đầu tiên tôi bị trúng bom java như vậy. –

Trả lời

33

Theo mặc định, . không phù hợp ngắt dòng. Vì vậy, tôi đoán là content của bạn chứa ngắt dòng.

Cũng lưu ý rằng matches sẽ khớp với toàn bộ chuỗi, không chỉ là một phần của chuỗi: nó không làm những gì contains làm!

Một số ví dụ:

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 

Các (?s) trong ví dụ cuối cùng sẽ gây ra . để phù hợp với ngắt dòng là tốt. Vì vậy, (?s).* sẽ khớp với bất kỳ chuỗi nào.

+1

Bạn đã lưu ngày của tôi :) Tôi đã không nhận ra rằng các kết quả phù hợp() muốn khớp với toàn bộ chuỗi. –

+1

@Miroslav, vâng, sai lầm được thực hiện dễ dàng vì nhiều ngôn ngữ "tìm" cho một trận đấu thay vì khớp với toàn bộ chuỗi. Tốt khi nghe bạn giải quyết nó! –

Các vấn đề liên quan