2010-03-07 46 views
21

在我的程序中,我有一个字符串(从外部库中获得)与任何正则表达式都不匹配。string.matches(“。*”)返回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 

任何想法可能是什么错?当我将content打印到标准输出时,它看起来没问题。

下面是从PDF(我用的iText 5.0.1)中提取文本代码:

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

标记为最喜欢的,因为它不是我第一次被这种java炸弹击中。 – 2012-05-25 14:03:52

回答

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

你保存了我的一天:)我没有意识到matches()想匹配整个字符串。 – 2010-03-07 15:54:37

+1

@Miroslav,是的,很容易犯这个错误,因为很多语言都在寻找匹配,而不是匹配整个字符串。很高兴听到你解决它! – 2010-03-07 16:03:12