/ / Regex dans le scanner ne trouve que la première correspondance - java, regex, analyse, java.util.scanner

La regex dans le scanner ne trouve que la première correspondance - java, regex, analyse, java.util.scanner

J'ai un fichier texte contenant un certain nombre d'articles que je dois analyser.

J'ai besoin de récupérer chaque mot dans chaquearticle, en excluant les points, virgules, etc. Les articles sont séparés par deux lignes spécifiques et j’essaie d’utiliser un motif regex pour trouver ces points.

Un exemple de document est le suivant:

.I 1
.W
this is article one.
.I 2
.W
this is article two.
.I 3
.W
this is article three.

Le code ci-dessous semble trouver la première occurrence .I 1 et ajoute tous les mots suivants, mais dès qu’il arrive au séparateur suivant, il l’ajoute sous forme de mot au lieu de le sauter.

Scanner scanner = new Scanner(document);
scanner.useDelimiter("[^\w"]+");
String separator;
while (scanner.hasNext()){
separator = scanner.findInLine(Pattern.compile(".I \d"));
if (separator!= null) {
System.out.println("Found: " + separator);
scanner.nextLine();
scanner.nextLine();
}
list.add(scanner.next());
}
scanner.close();

Si possible, j'aimerais aussi pouvoir saisir le numéro d’article actuel, qui est le numéro attaché à chaque séparateur.

Quel est le problème dans mon code?

Réponses:

1 pour la réponse № 1

Le problème est que puisque vous dites à la Scanner d'utiliser tout sauf les caractères de mots et les ticks comme délimiteurs, le point devant I est consommé par scanner.next() chaque fois qu'il est sur le point de monter dans votre findInLine chercher.

Vous pouvez résoudre ce problème en lisant entrée par ligne au lieu de le lire par mot, comme ceci:

list.add(scanner.nextLine());

Pour obtenir le numéro d'article, analysez le délimiteur à partir du caractère 3:

int num = Integer.valueOf(separator.substring(3));

Voici une démo qui lit à partir d'une entrée standard:

Scanner scanner = new Scanner(System.in);
scanner.useDelimiter("[^\w"]+");
String separator;
Pattern rx = Pattern.compile(".I \d");
while (scanner.hasNext()){
separator = scanner.findInLine(rx);
if (separator!= null) {
int num = Integer.valueOf(separator.substring(3));
System.out.println("Found: " + separator+", article number: "+num);
scanner.nextLine();
scanner.nextLine();
}
System.out.println(scanner.nextLine());
}
scanner.close();

Démo.