Imaginez que mon objectif dans un programme est d'analyser autant d'occurrences de "ab"
que possible sur une chaîne. J'aborde ce problème avec le code suivant:Analyse syntaxique Java
public static void main(String[] args)
{
final String expression = "^(\\s*ab)";
Scanner scanner = new Scanner("ab abab ab");
while (scanner.hasNext())
{
String next = scanner.findWithinHorizon(expression, 0);
if (next == null)
{
System.out.println("FAIL");
break;
}
else
{
System.out.println(next);
}
}
}
Le caret au début de l'expression est de désavouer quoi que ce soit, mais des espaces au début de chaque lecture comme mentionné here. Il est là pour empêcher quelque chose comme "cab"
ou "c ab"
d'être autorisé. En fait, je m'attendrais à ce que null soit retourné et que FAIL soit imprimé sur la console si l'un de ces deux cas se produit. Si je supprime le caret de l'expression, il fonctionne parfaitement sur les entrées telles que "ab abab ab"
, mais ne renvoie pas la valeur null pour "c ab"
. D'un autre côté, si je laisse le curseur, "c ab"
renvoie null comme prévu mais "ab abab ab"
échoue. Comment puis-je faire ce travail?
Modifier
Mon message original a peut-être été un peu vague. L'exemple que j'ai donné ci-dessus est une version plus simple de mon vrai problème. le motif ab
est un motif de remplissage que je remplacerais par quelque chose de plus intéressant, par exemple une adresse e-mail regex ou une valeur hexadécimale.
Dans mon application, l'entrée du scanner n'est pas une chaîne, mais un flux d'entrée dont je n'ai aucune connaissance. Mon but dans la boucle est de lire les valeurs une à la fois à partir de l'entrée et de vérifier que leur contenu correspond à un modèle. Si c'est le cas, je pourrais faire quelque chose de plus intéressant avec eux. Sinon, le programme se termine.
Dans l'exemple ci-dessus, je me attends à une entrée ab ABAB ab à la sortie:
ab
ab
ab
ab
je me attends c ab
à la sortie:
FAIL
et je me attends ab cab
à la sortie:
ab
FAIL
Votre but est un peu déroutant. Si vous voulez analyser les occurrences de "ab", alors pourquoi "c ab" n'est pas correct? C'est un événement. Voulez-vous dire que vous voulez une chaîne qui n'a que ces 2 caractères dedans? –
pourriez-vous préciser les critères d'appariement et fournir des exemples de chaînes avec les résultats attendus? Vous mentionnez que vous voulez analyser autant d'occurrences de 'ab' d'une chaîne, mais vous dites ensuite que 'cab' et 'c ab' ne devraient pas correspondre. La chaîne doit-elle contenir uniquement la combinaison de lettres «ab»? –
Mise à jour de mon message maintenant. – LandonSchropp