Problème de correspondance du jeton dans une ligne, lors de l'utilisation de Scanner en Java

StackOverflow https://stackoverflow.com/questions/1225009

  •  22-07-2019
  •  | 
  •  

Question

Je dois faire correspondre certaines choses à partir des lignes d'un texte d'entrée. Les lignes ressemblent à ceci:

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

J'utilise la classe Scanner pour lire chaque ligne du texte et j'ai écrit le code suivant. Cependant, quelque chose ne fonctionne pas correctement, car le motif "à" et " n'est pas mis en correspondance avec la ligne, et il devrait l'être, car "à" est contenu dans la ligne (j'ai essayé de faire correspondre non seulement "à" 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 dernière question: comment puis-je traiter la ligne de manière à tout stocker du début à la fin du premier " / & " symbole? Je ne pouvais trouver aucune méthode pour cela dans l'API. Est-il possible de le faire? En gros, je veux parcourir la ligne consécutivement, stocker des parties de la ligne dans différentes variables, puis utiliser les valeurs de ces variables. Comme je ne sais pas combien de jetons il me reste avant le premier " / " symbole, je ne peux pas utiliser next () un certain nombre de fois.

Merci d'avance.

Était-ce utile?

La solution

.matches () tente de faire correspondre la chaîne d'entrée entière . Utilisez .find () si vous souhaitez faire correspondre une partie de la chaîne d'entrée ou .lookingAt () si vous souhaitez 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 même, si vous développez votre modèle pour inclure des groupes correspondants (voir une référence générale pour les expressions rationnelles pour plus de détails sur le fonctionnement des groupes correspondants), vous pouvez utiliser la fonction .group () après une correspondance réussie. pour récupérer la sous-chaîne mise en correspondance par un groupe particulier dans le motif.

Autres conseils

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 pour extraire les jetons en utilisant

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

Évidemment, vous ne voudriez pas brancher les morceaux de code ci-dessus directement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top