Analyse syntaxique en java

Fermé
alffouss Messages postés 121 Date d'inscription mercredi 15 octobre 2008 Statut Membre Dernière intervention 20 octobre 2021 - 28 juil. 2009 à 11:43
alffouss Messages postés 121 Date d'inscription mercredi 15 octobre 2008 Statut Membre Dernière intervention 20 octobre 2021 - 30 juil. 2009 à 17:56
Bonjour,


je travaille actuellement sur un projet java et je ne sais pas quel package java je dois importer pour effectuer une analyse syntaxique.

En effet, le but est de fournir un triplet de la maniére suivant:@IP;login,Mot de passe.


Ces triplets sont soumis aux conditions suivantes: les elements de chaque triplet doivent être separé par des points virgules, la taille du login ne doit pas depassé 12 charactéres, la taille du mot de passe ne doit pas depassé 20 charactére.

Je veux juste savoir l'API java que je dois utilisé pour effectuer cette tâche.

Merci d'avance pour votre reponse
A voir également:

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 :
	// 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
1
alffouss Messages postés 121 Date d'inscription mercredi 15 octobre 2008 Statut Membre Dernière intervention 20 octobre 2021 5
28 juil. 2009 à 14:23
merci pour votre aide
je vais essayer ça.
0
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):
    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 ?
1
Classe Tokenizer ou méthode split() de la classe String peut-être. :)
0
StringTokenizer, pas tokenizer simplement.
0
alffouss Messages postés 121 Date d'inscription mercredi 15 octobre 2008 Statut Membre Dernière intervention 20 octobre 2021 5
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();
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
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
0
Utilisateur anonyme
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
0
alffouss Messages postés 121 Date d'inscription mercredi 15 octobre 2008 Statut Membre Dernière intervention 20 octobre 2021 5
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
0
Utilisateur anonyme
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
0
alffouss Messages postés 121 Date d'inscription mercredi 15 octobre 2008 Statut Membre Dernière intervention 20 octobre 2021 5
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.
0
alffouss Messages postés 121 Date d'inscription mercredi 15 octobre 2008 Statut Membre Dernière intervention 20 octobre 2021 5
29 juil. 2009 à 11:48
je te remerice bien pour ton aide
je le ferai comme tu l'as di
0
Utilisateur anonyme
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");
0
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
Utilisateur anonyme
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
0
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 !
0
alffouss Messages postés 121 Date d'inscription mercredi 15 octobre 2008 Statut Membre Dernière intervention 20 octobre 2021 5
30 juil. 2009 à 17:56
je vous remercie tous les deux

Vous êtes chics
0