IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Expressions Régulières en Java


Sujet :

Langage Java

  1. #1
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut Expressions Régulières en Java
    je veux déclarer une chaine de caractères pour l'utiliser comme expression régulière mais ça me donne toujours erreur pourtant j'ai suivi les instructions d'un cours:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String expAdd = "[0-9]+"; //erreur là et même \d+ génère erreur
    pat = Pattern.compiler(expAdd);
    donc quelle est le bon format ?

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    c'est compile(), pas compiler().

    Mais il n'y a aucune erreur sur la ligne montrée, tu dois te tromper.
    Par contre ce n'est pas "\d+" mais "\\d+", puisque \ est un caractère d'échappement, dans les String et dans les regex.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    j'ai mis compile(), même chose voilà une photo

    Nom : 2016-03-13_21-15-56.jpg
Affichages : 300
Taille : 27,4 Ko

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Ahah, ce sont les private et static qui ont vendu la mèche.

    Tu es directement dans le corps de la classe, là, pas dans une méthode ou un bloc d'instruction.
    Autrement dit tu es dans un endroit où tu n'as pas le droit de faire n'importe quelle instruction, tu ne peux faire que des déclarations de variables.

    Or, si la ligne String expAdd = "[0-9]+"; est parfaite, elle est par contre suivie de pat = Pattern.compiler(expAdd); qui est une assignation sans déclaration, ça ne va pas.
    Le compilateur détecte que tu ne peux pas faire ça, mais il n'est pas assez malin pour trouver exactement quelle est ton erreur de pensée. Il croit que tu essayais de déclarer deux variables expAdd et pat, et donc il fallait une virgule , et non pas un point-virgule ;
    Alors que ton problème, c'est que tu essaies de mettre des instructions ailleurs que dans un bloc d'instruction.

    Syntaxe correcte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private static final String EXPRESSION = "[0-9]+";
    private static final Pattern PATTERN = Pattern.compile(EXPRESSION);
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    emmm; je crois que j'ai un petit peu compris le manège, merci l'erreur a disparu, je peux enfin commencer ma fameuse calculatrice

  6. #6
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    je n'arrive pas à suivre les tutoriels, par exemple je trouve que pour un caractère spécial on ajoute anti slash mais ça donne erreur chez moi pour cette expression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private static final String expAdd = "[0-9]+[\\+-\\*/][0-9]+";
    voilà l'erreur "Caused by: java.util.regex.PatternSyntaxException: Illegal character range near index 11[0-9]+[\+-\*/][0-9]+"

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    eh bien, regardons un peu ce truc-là, [0-9]
    Tu as remarqué qu'il y a un - entre les deux chiffres pour dire qu'on prend tous les chiffres de 0 à 9 ?

    Et donc dans [\\+-\\*/] où il y a un - aussi... À ton avis que se passe-t-il ?
    C'est à ce - qu'il fallait mettre des \\ alors que les autres n'en avaient pas besoin.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    j'ai compris, alors quand il pointait sur * c'était le - en question, je vais essayer

  9. #9
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    alors voilà mon code et ça ne matche pas bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private static final String op = "[+\\-*/]";
    private static final String expAdd = "(^\\d+(op)\\d+)*";
    private static final Pattern pat = Pattern.compile(expAdd);
    private static Matcher mat;
    ...
    mat = pat.matcher(textField.getText());
    if (mat.matches()) {
    	lblNewLabel.setText("bon format");
    }else{
    	lblNewLabel.setText("erreur format");
    }
    j'ai testé 1+2-5 ça donne erreur format

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Heu, ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static final String expAdd = "(^\\d+(op)\\d+)*";
    ca matche

    "4op5" mais pas "4+5" ou "4-5" ...

    Ensuite mettre ^ dans un groupe et mettre ce groupe en 0..n fois, c'est inutile, car le ^correspondant au début de la ligne, il ne peux y avoir maximum qu'un seul match.


    Bref ton expression doit être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static final String expAdd = "\\d+([+\\-*/]\\d+)*";

  11. #11
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    et si je veux laisser op comme une sous chaîne je la représente comment ? avec des []? car j'ai besoin de récupérer les groupes pour pouvoir faire le calcul selon le nombre donné et l'opération choisie

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Si tu parle de faire référence à ta variable op, ce n'est pas possible, le moteur d'expression régulière ne la connait pas, comment il pourrait y avoir accès? De plus les expression régulières n'ont pas la notion de variables. Tout ce que tu peux éventuellement écrire c'est une concaténation, mais ça peux rendre ton code imbuvable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static final String expAdd = "\\d+("+op+"\\d+)*";

  13. #13
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    est ce que je peux tout récupérer avec ce code?
    j'ai mis ce code dans un affichage mais je reçois rien en console pourtant le code ne donne pas d'erreurs

  14. #14
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    en fait, j'ai pensé à mettre les opérateurs dans un string pour pouvoir utiliser split(op), de cette façon je pourrai récupérer tous les nombres dans un tableau et tous les opérateurs dans un autre et faire le calcul, car je ne voie pas autres solutions

  15. #15
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Hind4Dev Voir le message
    j'ai mis ce code dans un affichage mais je reçois rien en console pourtant le code ne donne pas d'erreurs
    Le code que t'as mis appelle une méthode mais ne fait rien du résultat. Faudrait un peu plus de code pour debugger ton problème d'affichage. Sinon oui, group est censé te retourné la partie de la chaine qui a matché la pattern.

  16. #16
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    alors là je ne comprends plus comment il cherche ces groupes voilà mon expression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String expAdd = "^(\\d)+(([+\\-*/])(\\d+))*";
    et j'ai fais un affichage pour savoir s'il me donne les groupes avant de les sauvegarder dans le tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    mat = pat.matcher(textField.getText());				
    				if (!mat.matches()) {
    					JOptionPane.showMessageDialog(null, "Votre expression arithmétique est fausse, veillez la reformuler.", "Erreur", JOptionPane.ERROR_MESSAGE);
    				}else{
    					for (int i = 0; i <= mat.groupCount(); i++) {
    							System.out.println("groupe "+ i + ":" + mat.group(i));
    					}
    				}
    j'ai donné cette formule: 1*5-458/45+65
    et voilà ce qu'il m'affcihe:

    • groupe 0:1*5-458/45+65
    • groupe 1:1
    • groupe 2:+65
    • groupe 3:+
    • groupe 4:65

    donc où sont passé les autres: 5,458,45,*,-,/ ???

  17. #17
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    je viens d'essayer aussi ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    mat = pat.matcher(textField.getText());String[] val = pat.split("\\D");
    if (!mat.matches()) {
        JOptionPane.showMessageDialog(null, "Votre expression arithmétique est fausse, veillez la reformuler.", "Erreur", JOptionPane.ERROR_MESSAGE);
    }else{
        for (int i = 0; i < val.length; i++) {
            System.out.println(val[i]);
       }
    }
    ça m'a donné juste \D
    je veux effectuer un split pour récupérer les chiffres

  18. #18
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Hind4Dev Voir le message
    alors là je ne comprends plus comment il cherche ces groupes voilà mon expression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String expAdd = "^(\\d)+(([+\\-*/])(\\d+))*";
    Il faut lire les parenthèses de gauches à droite. Le groupe 0 correspond toujours à la totalité du match
    Ensuite, les groupe 1 et 2 correspondent aux première et deuxième parenthèses ouvrantes.
    ^(\\d)+(([+\\-*/])(\\d+))*
    Note que le * n'est pas inclu dans la parenthèse. Comme un groupe ne peux avoir qu'une valeur, il aura dans ce cas comme valeur le dernier match correspondant qu'aura trouvé le moteur de la regexp.

    Dans ton exemple, ça correspond bien à
    1*5-458/45+65

    On continue la suite des parenthèses, vers les groupes 3 et 4 en suivant de gauche à droite:
    ^(\\d)+(([+\\-*/])(\\d+))*
    Elle sont à l'intérieur de la parenthèse 2, donc de ton +65. Elle correspondent donc respectivement à + et 65

    Le reste n'est pas récupérable par ton expression régulière. Je précise que si ton but est de décomposer ton expression mathématique, les expression régulières ne sont pas vraiment l'outil destiné à ça. Ca implique une notion de récursivité que les expression régulières n'ont pas.




    Citation Envoyé par Hind4Dev Voir le message
    je viens d'essayer aussi ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    mat = pat.matcher(textField.getText());String[] val = pat.split("\\D");
    if (!mat.matches()) {
        JOptionPane.showMessageDialog(null, "Votre expression arithmétique est fausse, veillez la reformuler.", "Erreur", JOptionPane.ERROR_MESSAGE);
    }else{
        for (int i = 0; i < val.length; i++) {
            System.out.println(val[i]);
       }
    }
    ça m'a donné juste \D
    je veux effectuer un split pour récupérer les chiffres
    Heu là tu tente de splitter la chaine \D autour de la pattern globale. Si tu veux splitter ton textfield, pour trouver les chiffre c'est sur la String venant du TextField qu'il faut appliquer le split.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] val = textField.getText().split("\\D");

  19. #19
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    merci beaucoup, j'ai compris, je croyait qu'il faut appliquer le split() sur le pattern, je ne savais pas que c'est une méthode java qui peut être applicable à n'importe quelle chaîne de caractères.

  20. #20
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ces deux codes sont équivalent en fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    String texte = ...
    String pattern = ...
     
    texte.split(pattern);
    Pattern.compile(pattern).split(texte);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Les expressions régulières en java
    Par blackhock dans le forum Général Java
    Réponses: 2
    Dernier message: 21/04/2009, 13h05
  2. Expression régulière avec java
    Par mouvma dans le forum Général Java
    Réponses: 2
    Dernier message: 18/01/2008, 17h00
  3. expression régulière en java
    Par shirya dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 21/09/2007, 16h10
  4. expression régulière en java
    Par Karine2007 dans le forum Langage
    Réponses: 9
    Dernier message: 07/07/2007, 12h35
  5. Expressions régulières en Java
    Par jason69 dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 04/07/2007, 10h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo