2010-03-07 17 views
21

En mi programa, tengo una cadena (obtenida de una biblioteca externa) que no coincide con ninguna expresión regular.string.matches (". *") Devuelve falso

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 

¿Alguna idea de lo que podría estar mal? Cuando imprimo content en stdout, se ve bien.

Este es el código para extraer el texto del PDF (estoy usando iText 5.0.1):

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

marcado como favorito, ya que no es la primera vez que una bomba java me golpea. –

Respuesta

33

Por defecto, el . no coincide con saltos de línea. Así que supongo que su content contiene un salto de línea.

También tenga en cuenta que matches coincidirá con toda la cadena, no solo con una parte: ¡no hace lo que hace contains!

Algunos ejemplos:

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 

El (?s) en el último ejemplo hará que el . para que coincida con saltos de línea también. Entonces (?s).* coincidirá con cualquier cadena.

+1

Salvaste mi día :) No me di cuenta de que matches() quiere hacer coincidir toda la cadena. –

+1

@Miroslav, sí, el error se comete fácilmente, ya que muchos idiomas "buscan" una coincidencia en lugar de coincidir con toda la cadena. ¡Es bueno escuchar que lo resolvió! –

Cuestiones relacionadas