2009-08-03 8 views
1

Je dois faire correspondre certaines choses à partir des lignes d'un texte d'entrée. Les lignes ressemblent à ceci:Problème avec le jeton correspondant dans une ligne, en utilisant le scanner en Java

to be/ Σ _ Σ [1pos, 1neg] {0=1, 2=1} 

J'utilise la classe du scanner pour lire chaque ligne du texte, et moi avons écrit le code suivant. Cependant, quelque chose ne fonctionne pas correctement, car le motif "to" n'est pas apparié à la ligne, et il devrait l'être, car "to" est contenu dans la ligne (j'ai essayé de faire correspondre non seulement "to" de la ligne, mais rien ne correspond):

Scanner scanner = new Scanner(file); 
while(scanner.hasNext()) { 
     String line = scanner.nextLine(); 
     System.out.println("line: " + line); 
     Pattern p_pos = Pattern.compile("to"); 
     Matcher m_pos = p_pos.matcher(line); 
     String match = m_pos.group(0); 
     System.out.println("match: " + match); 
     boolean b_pos = m_pos.matches(); 
     if(b_pos) { 
      System.out.println(match); 
     } 
} 

sortie:

line: to be/ Σ _ Σ [1pos, 1neg] {0=1, 2=1} 
Exception in thread "main" java.lang.IllegalStateException: No match found 
    at java.util.regex.Matcher.group(Matcher.java:485) 
    at lady.PhrasesFromFile.readFile(PhrasesFromFile.java:31) 
    at lady.PhrasesFromFile.main(PhrasesFromFile.java:17) 

J'ai une autre question: comment puis-je traiter la ligne de sorte que je stocke tout depuis le début de la ligne jusqu'à ce que le premier «/» symbole? Je n'ai trouvé aucune méthode pour cela dans l'API. Est-il possible de le faire? Je veux fondamentalement passer par la ligne, stocker des morceaux de la ligne dans différentes variables, puis utiliser les valeurs de ces variables. Puisque je ne sais pas combien de jetons j'ai avant le premier symbole "/", je ne peux pas utiliser next() un certain nombre de fois.

Merci d'avance.

Répondre

1

.matches() essaie de faire correspondre entier chaîne d'entrée. Utilisez .find() si vous voulez faire correspondre une partie de la chaîne d'entrée, ou .lookingAt() si vous voulez faire correspondre le début de la chaîne d'entrée.

http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Matcher.html

De plus, si vous développez votre modèle pour inclure des groupes correspondant (voir une référence regex générale pour plus de détails sur la façon dont les groupes correspondant à travailler), vous pouvez utiliser la fonction .group() après un match réussi à récupérer la sous-chaîne apparié par un groupe particulier dans le modèle.

1

Vous pouvez extraire la partie dont vous avez besoin pour les jetons en utilisant:

String tokenSection = Pattern.compile("(to\\s+.*?)/").matcher(line).find().group(1); 

puis en boucle sur que pour extraire les jetons en utilisant

Pattern.compile("\\w+").matcher(tokenSection).find(); 

De toute évidence, vous ne branchez le dessus morceaux de code à l'intérieur.

Questions connexes