Analyse syntaxique en java
Fermé
alffouss
Messages postés
125
Date d'inscription
mercredi 15 octobre 2008
Statut
Membre
Dernière intervention
20 novembre 2024
-
28 juil. 2009 à 11:43
alffouss Messages postés 125 Date d'inscription mercredi 15 octobre 2008 Statut Membre Dernière intervention 20 novembre 2024 - 30 juil. 2009 à 17:56
alffouss Messages postés 125 Date d'inscription mercredi 15 octobre 2008 Statut Membre Dernière intervention 20 novembre 2024 - 30 juil. 2009 à 17:56
A voir également:
- Analyse syntaxique en java
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel football - Télécharger - Jeux vidéo
- Java apk - Télécharger - Langages
- Analyse disque dur - Télécharger - Informations & Diagnostic
- Analyse performance pc - Guide
15 réponses
Bonjour,
StringTokennizer peut servir à découper la ligne en fonction de séparateurs, mais ton besoin me paraît plutôt relever des expressions régulières ou regex.
Si tu veux faire des analyses complexes, tu as le package java.util.regex, mais sinon, la classe String offre déjà la possibilité de chercher avec une regex :
exemple :
Bo courage
StringTokennizer peut servir à découper la ligne en fonction de séparateurs, mais ton besoin me paraît plutôt relever des expressions régulières ou regex.
Si tu veux faire des analyses complexes, tu as le package java.util.regex, mais sinon, la classe String offre déjà la possibilité de chercher avec une regex :
exemple :
// une chaîne avec 3 sous chaînes séparées par point virgule // La première quelconque, la 2ieme entre 5 et 12 lettres minuscules // la dernière entre 1 et 20 caractères quelconques public static final String MA_REGEX = ".*;[a-z]{5,12};.{1,20}"; // exemple de méthode qui l'utilise : /** * Cette méthode retourne true si la chaîne * correspond à MA_REGEX * @param morceaustring * @return */ public boolean chaineok(String morceaustring) { boolean retour = false; if (morceaustring != null) { retour = morceaustring.matches(MA_REGEX); } return retour; }
Bo courage
bonjour, allfouss
tu te poses une question à laquelle, me semble-t-il, j'ai répondu hier : les regex.
La méthode que je te propose permet de vérifier que les contraintes sur le nombre de caractères, et même si tu le désire des contraintes sur les caractères autorisés/interdits est respectée ou non par retour d'un booléen.
Je te donnais l'exemple pour indiquer la piste à suivre, mais les regex permettent de faire plus fort : tu peux te passer de l'utilisation de StringTokenizer, qui soit dit en passant est considérée comme "dépassée" par Sun : voir doc du jdk.
En effet, si tu utlise les classes Matcher et Pattern de java.util.regex, et que tu divise ta chaîne en groupes, tu peux non seulement vérifier les contraintes, mais en plus découper la chaîne originale pour avoir,des détail des valeurs.
Si tu ne connais pas les regex, il faudra un peut étudier (doc sun classe Pattern), mais le pincipe est le suivant :
Chaque fois que tu veux identifier un groupe de caractères, tu l'entoure de parenthèses.
exemple :
en adaptant la regex MA_REGEX précédente (aout de 3 groupes de parenthèses):
On peut faire une fonction qui te retourne dans un tableau de string les 3 chaines (ou null si echec décodage)
Certes, c'est un peu plus technique qu'avec StringTokennizer, mais tellement plus puissant !
C'est pas fun, ça ?
tu te poses une question à laquelle, me semble-t-il, j'ai répondu hier : les regex.
La méthode que je te propose permet de vérifier que les contraintes sur le nombre de caractères, et même si tu le désire des contraintes sur les caractères autorisés/interdits est respectée ou non par retour d'un booléen.
Je te donnais l'exemple pour indiquer la piste à suivre, mais les regex permettent de faire plus fort : tu peux te passer de l'utilisation de StringTokenizer, qui soit dit en passant est considérée comme "dépassée" par Sun : voir doc du jdk.
En effet, si tu utlise les classes Matcher et Pattern de java.util.regex, et que tu divise ta chaîne en groupes, tu peux non seulement vérifier les contraintes, mais en plus découper la chaîne originale pour avoir,des détail des valeurs.
Si tu ne connais pas les regex, il faudra un peut étudier (doc sun classe Pattern), mais le pincipe est le suivant :
Chaque fois que tu veux identifier un groupe de caractères, tu l'entoure de parenthèses.
exemple :
en adaptant la regex MA_REGEX précédente (aout de 3 groupes de parenthèses):
public static final String MA_REGEX_GRP = "(.*);([a-z]{5,12});(.{1,20})";
On peut faire une fonction qui te retourne dans un tableau de string les 3 chaines (ou null si echec décodage)
/** * Cette méthode renvoie dans un tableau les 3 valeurs * séparées par des points virgules définies par la regex * MA_REGEX_GRP. Si quelque chose n'est pas bon, * le tableau renvoyé est null. * @param lareponse * @return */ public String[] extraitAdresseLogPwd(String lareponse) { String [] resultat = null; // Petit tableau pour l'affichage final String[] NOMS_ARGUMENTS = {"IP", "Login", "Password"}; Matcher match = Pattern.compile(MA_REGEX_GRP).matcher(lareponse); if (match.find()) { resultat = new String[match.groupCount()]; for(int i = 0; i < match.groupCount(); ++i) { // le groupe 0 = toute la chaîne. les groupes démarrent en fait à 1 resultat[i] = match.group(i+1); System.out.println(NOMS_ARGUMENTS[i] + " = " + resultat[i]); } } return resultat; }
Certes, c'est un peu plus technique qu'avec StringTokennizer, mais tellement plus puissant !
C'est pas fun, ça ?
alffouss
Messages postés
125
Date d'inscription
mercredi 15 octobre 2008
Statut
Membre
Dernière intervention
20 novembre 2024
5
28 juil. 2009 à 15:33
28 juil. 2009 à 15:33
voila ce que j'ai fai mais je voulais mettre comme separateur un point virgue(;) et la je ne peut mettre que des espace.
vous saver comment je doit faire en mettant que des (;) comme separateur et en imposant la taille de chaque element ("10.0.0.1 toto MoMo";)
voici mon code
import java.util.StringTokenizer;
public class Tok {
private static final StringTokenizer parser = null;
public static void main(String[] args) {
String aString = "10.0.0.1 toto MoMo";
StringTokenizer parser = new StringTokenizer(aString);
while (parser.hasMoreTokens()) {
System.out.println(parser.nextToken());
}
} String premier = parser.nextToken();
}
vous saver comment je doit faire en mettant que des (;) comme separateur et en imposant la taille de chaque element ("10.0.0.1 toto MoMo";)
voici mon code
import java.util.StringTokenizer;
public class Tok {
private static final StringTokenizer parser = null;
public static void main(String[] args) {
String aString = "10.0.0.1 toto MoMo";
StringTokenizer parser = new StringTokenizer(aString);
while (parser.hasMoreTokens()) {
System.out.println(parser.nextToken());
}
} String premier = parser.nextToken();
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Utilisateur anonyme
28 juil. 2009 à 21:27
28 juil. 2009 à 21:27
Salut.
C'est parceque par défaut les séparateurs sont:
l'espace, \t, \n, \r, et \f
Si tu veux un (ou plusieurs) séparateurs il faut l'indiquer:
StringTokenizer parser = new StringTokenizer(aString), ";"; et bien entendu remplacer
String aString = "10.0.0.1 toto MoMo"; par
String aString = "10.0.0.1;toto;MoMo"; // 3 tokens
Si tu ne veux que le 1er tu remplaces:
while (parser.hasMoreTokens()) { par:
if(parser.hasMoreTokens()) {
Tu peux suppimer dans les 2 cas String premier = parser.nextToken();
Cordialement,
Dan
C'est parceque par défaut les séparateurs sont:
l'espace, \t, \n, \r, et \f
Si tu veux un (ou plusieurs) séparateurs il faut l'indiquer:
StringTokenizer parser = new StringTokenizer(aString), ";"; et bien entendu remplacer
String aString = "10.0.0.1 toto MoMo"; par
String aString = "10.0.0.1;toto;MoMo"; // 3 tokens
Si tu ne veux que le 1er tu remplaces:
while (parser.hasMoreTokens()) { par:
if(parser.hasMoreTokens()) {
Tu peux suppimer dans les 2 cas String premier = parser.nextToken();
Cordialement,
Dan
Utilisateur anonyme
28 juil. 2009 à 21:34
28 juil. 2009 à 21:34
Ps,
Désolé ce n'est pas:
StringTokenizer parser = new StringTokenizer(aString), ";"; qu'il faut mais:
StringTokenizer parser = new StringTokenizer((aString), ";");
Dan
Désolé ce n'est pas:
StringTokenizer parser = new StringTokenizer(aString), ";"; qu'il faut mais:
StringTokenizer parser = new StringTokenizer((aString), ";");
Dan
alffouss
Messages postés
125
Date d'inscription
mercredi 15 octobre 2008
Statut
Membre
Dernière intervention
20 novembre 2024
5
29 juil. 2009 à 09:59
29 juil. 2009 à 09:59
je te remerci. ça marche pour le separateur.
mais si je voulais impose un taille fixe pour 3 tocken je doit faire comment
Exemple: pour le premier tocken je veux qu'il fasse 12 charactères Maxi
pour le deuxiéme tocken je veux qu'il fasse 8 charactères Maxi
pour le troisiéme tocken je veux qu'il fasse 5 charactères Maxi
comment je doit faire SLVP
mais si je voulais impose un taille fixe pour 3 tocken je doit faire comment
Exemple: pour le premier tocken je veux qu'il fasse 12 charactères Maxi
pour le deuxiéme tocken je veux qu'il fasse 8 charactères Maxi
pour le troisiéme tocken je veux qu'il fasse 5 charactères Maxi
comment je doit faire SLVP
Utilisateur anonyme
29 juil. 2009 à 10:31
29 juil. 2009 à 10:31
Tu dis:
"pour le premier tocken je veux qu'il fasse 12 charactères Maxi"
pour le deuxiéme tocken je veux qu'il fasse 8 charactères Maxi"
pour le troisiéme tocken je veux qu'il fasse 5 charactères Maxi"
Il n'y a pas de longueur mini?
Dan
"pour le premier tocken je veux qu'il fasse 12 charactères Maxi"
pour le deuxiéme tocken je veux qu'il fasse 8 charactères Maxi"
pour le troisiéme tocken je veux qu'il fasse 5 charactères Maxi"
Il n'y a pas de longueur mini?
Dan
alffouss
Messages postés
125
Date d'inscription
mercredi 15 octobre 2008
Statut
Membre
Dernière intervention
20 novembre 2024
5
29 juil. 2009 à 10:38
29 juil. 2009 à 10:38
oui en faite:
Pour le premier tocken, je veux qu'il soit compris entre 8 et 12 caractères
Pour le deuxième tocken, je veux qu'il soit compris entre 5 et 13 caractères
Pour le toisiéme tocken, je veux qu'il soit compris entre 5 et 10 caractères
C'est codition je dois les imposer à l'outil.
Si ces codition ne sont pas respecter, je veux que les tocken s'affiche en rouge ou que l'outil envoie un message d'erreur.
Merci pour ton aide.
Pour le premier tocken, je veux qu'il soit compris entre 8 et 12 caractères
Pour le deuxième tocken, je veux qu'il soit compris entre 5 et 13 caractères
Pour le toisiéme tocken, je veux qu'il soit compris entre 5 et 10 caractères
C'est codition je dois les imposer à l'outil.
Si ces codition ne sont pas respecter, je veux que les tocken s'affiche en rouge ou que l'outil envoie un message d'erreur.
Merci pour ton aide.
alffouss
Messages postés
125
Date d'inscription
mercredi 15 octobre 2008
Statut
Membre
Dernière intervention
20 novembre 2024
5
29 juil. 2009 à 11:48
29 juil. 2009 à 11:48
je te remerice bien pour ton aide
je le ferai comme tu l'as di
je le ferai comme tu l'as di
Utilisateur anonyme
29 juil. 2009 à 11:48
29 juil. 2009 à 11:48
J'attendais une réponse à ma dernière question, mais j'ai choisi les types des caractères:
// REGEX
// une chaîne avec 3 sous chaînes séparées par point virgule
// La première de 8 a 12 caracteres , la 2ieme de 5 a 13
// la dernière de 5 a 10
//final String MA_REGEX = ".*;[a-z]{5,12};[0-9- ]{1,20}";
final String MA_REGEX = "[0-9-.]{8,12};[a-z]{5,13};[0-9- ]{5,10}";
String sousChaine = "10.0.0.1.10;qwertyaaaaabc;12345 6789";
System.out.println("\nretour: " + sousChaine.matches(MA_REGEX) + "\n");
// REGEX
// une chaîne avec 3 sous chaînes séparées par point virgule
// La première de 8 a 12 caracteres , la 2ieme de 5 a 13
// la dernière de 5 a 10
//final String MA_REGEX = ".*;[a-z]{5,12};[0-9- ]{1,20}";
final String MA_REGEX = "[0-9-.]{8,12};[a-z]{5,13};[0-9- ]{5,10}";
String sousChaine = "10.0.0.1.10;qwertyaaaaabc;12345 6789";
System.out.println("\nretour: " + sousChaine.matches(MA_REGEX) + "\n");
re-bonjour et petite info sur la réponse de danimo (que je salue) , il y a des erreurs dans les regex :
[0-9-.] est une expression invalide au sens regex, tout comme [0-9- ]
si on veut autoriser les digits de 0 à 9 et le point, il faut mettre [0-9.]
Si en plus on pinaille, ceci ne fera pas forcément une adresse ip correcte, en effet :
[0-9.]{8,12} laissera passer la chaîne : "........" composée de 8 fois le caractère point, ce qui n'est pas vraiment une adresse IP, et 192.168.120.56 est refusée parce faisant 14 caractères et pas 12
L'expression est donc, pour l'adresse IP, au minimum : [0-9.]{8,15}
De toute façon, tu peux très bien faire une deuxième analyse plus fine de chaque élément en refaisant une analyse regex plus précise une fois que les éléments sont séparés.
Salut à tous les 2 !
[0-9-.] est une expression invalide au sens regex, tout comme [0-9- ]
si on veut autoriser les digits de 0 à 9 et le point, il faut mettre [0-9.]
Si en plus on pinaille, ceci ne fera pas forcément une adresse ip correcte, en effet :
[0-9.]{8,12} laissera passer la chaîne : "........" composée de 8 fois le caractère point, ce qui n'est pas vraiment une adresse IP, et 192.168.120.56 est refusée parce faisant 14 caractères et pas 12
L'expression est donc, pour l'adresse IP, au minimum : [0-9.]{8,15}
De toute façon, tu peux très bien faire une deuxième analyse plus fine de chaque élément en refaisant une analyse regex plus précise une fois que les éléments sont séparés.
Salut à tous les 2 !
Utilisateur anonyme
29 juil. 2009 à 22:44
29 juil. 2009 à 22:44
Oui, oui: honte as moi pour ces -.] et - ]
Je dois dire que ce bout de code était l'amorce d'une éventuelle discussion pour l'adapter au cas réel de alffous.
Mais c'est fait et bien fait même...
Merci java4ever.
Cordialement,
Dan
Je dois dire que ce bout de code était l'amorce d'une éventuelle discussion pour l'adapter au cas réel de alffous.
Mais c'est fait et bien fait même...
Merci java4ever.
Cordialement,
Dan
Bonjour,
je poste surtout ce petit message pour remercier danimo de reconnaître sportivement sa petite erreur, et je te rassure, celui qui n'a jamais écrit une erreur sur un forum n'est à mon avis pas né !
L'important est qu'alffouss ait eu les réponses à ses questions, et qu'en prime on s'amuse à ces petits challenges techniques
A bientôt à alffouss et danimo sur le forum !
je poste surtout ce petit message pour remercier danimo de reconnaître sportivement sa petite erreur, et je te rassure, celui qui n'a jamais écrit une erreur sur un forum n'est à mon avis pas né !
L'important est qu'alffouss ait eu les réponses à ses questions, et qu'en prime on s'amuse à ces petits challenges techniques
A bientôt à alffouss et danimo sur le forum !
alffouss
Messages postés
125
Date d'inscription
mercredi 15 octobre 2008
Statut
Membre
Dernière intervention
20 novembre 2024
5
30 juil. 2009 à 17:56
30 juil. 2009 à 17:56
je vous remercie tous les deux
Vous êtes chics
Vous êtes chics
28 juil. 2009 à 14:23
je vais essayer ça.