2010-03-07 7 views
21

Dans mon programme, j'ai une chaîne (obtenue à partir d'une bibliothèque externe) qui ne correspond à aucune expression régulière.string.matches (". *") Renvoie la valeur 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 

Une idée de ce qui pourrait être faux? Lorsque j'imprime content sur stdout, cela semble correct.

Voici le code pour extraire le texte du PDF (J'utilise iText 5.0.1):

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

marqué comme favori car ce n'est pas la première fois que j'ai été frappé par une telle bombe java. –

Répondre

33

Par défaut, le . ne correspond pas à des sauts de ligne. Donc, je suppose que votre content contient un saut de ligne.

Notez également que matches correspondra à la totalité de la chaîne, pas seulement à une partie: elle ne fait pas ce que fait contains!

Quelques exemples:

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 

Le (?s) dans le dernier exemple entraînera la . de faire correspondre les sauts de ligne aussi bien. Donc, (?s).* correspond à n'importe quelle chaîne.

+1

Vous avez sauvé ma journée :) Je n'ai pas réalisé que matches() veut correspondre à la chaîne entière. –

+1

@ Miroslav, oui, l'erreur est facilement commise car de nombreuses langues "cherchent" une correspondance au lieu de faire correspondre la chaîne entière. C'est bon de vous entendre le résoudre! –

Questions connexes