2009-10-19 6 views
1

J'ai un problème en appliquant une regex dans mon code Java.
Ma chaîne de texte est comme ça (String myString)Regex - extraire des informations d'une chaîne en Java

 name: Abc Def; 
     blah: 1 2 3; 
     second name: Ghi; 

J'ai besoin d'extraire les informations de nom (Abc Def). Le nom peut contenir une chaîne de 1+ mots. Toutes les propriétés (nom, bla, deuxième nom) sont espacés avec des espaces blancs au début

Le code que je suis en train d'utiliser est

String patternStr = "\\s{2,}name:\\s([\\w ]*\\w+);"; 
Matcher matcher = Pattern.compile(patternStr).matcher(myString); 
if (matcher.matches()) 
    System.out.println(matcher.group(1)); 

Mon regex semble fonctionner très bien avec online tools (regex: \ s {2,} name: \ s ([\ w] * \ w +);) mais quand je le porte en Java, cela ne marche tout simplement pas. Une idée de ce qui me manque?

Merci beaucoup


Edit: Si je matcher.find() il fonctionne très bien.

Répondre

2

Le problème est sans doute que .match() tente de faire correspondre toute la ligne d'entrée. Donc soit vous pouvez ajouter un. + À la fin du motif pour manger le reste de la ligne ou utiliser .contains(). (avec .match() le ^ et $ au début et à la fin du modèle sont implicites)

Notez que vous devez fournir un drapeau lorsque vous devez faire correspondre l'entrée multi-ligne: .compile(patternStr, Perl5Compiler.MULTILINE_MASK)

5

Here ya go:

^\s*name:\s*([^;]+); 
  • Démarrer au début de la ligne.
  • Mangez autant d'espace qu'il y a d'espace.
  • Rechercher "name:"
  • Consommez autant d'espaces que vous le souhaitez.
  • quoi que ce soit avant la Capturez-virgule
  • Assurez-vous qu'il ya un point-virgule
+0

Merci pour l'expression rationnelle amélioration mais je pense que le problème est quand j'appelle matcher.matches(). Si j'utilise matcher.find() cela fonctionne très bien. – mickthompson

Questions connexes