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

Collection et Stream Java Discussion :

Regex en java


Sujet :

Collection et Stream Java

  1. #1
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Par défaut Regex en java
    Salut ..

    Ne comprends rien ...
    Voila je veux créer un regex qui me reconnait des chaines de caractères..
    Ex : [Mail] le regex <=> tout ce qui comporte au moins un crochet "[" et pareil pour l'autre "]", restriction pas de caractère de type : et )] et # .
    Donc mon motif dnas lequel je n'ai mis pour le moment que la première restriction -> "[\\[{1}?\\]{1}?[^:]]$", ben la restriction : ne marche pas. j'ai du oublier qq chose ou je ne comprends rien des regex ..

    Auriez vous une idée ?????
    Merci d'avance

  2. #2
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Par défaut Le regex il faut plancher
    Bon j'ai trouvé qq chose qui marche.
    [Mail] ou [ Mail ]avec ou sns espace .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^[\\[]{1}+([a-zA-Zespace&&[^:#&&[^\\)\\]]]]){2,}[\\]{1}+]$
    pour lire toute la ligne ^ ......$
    je veux un crochet de début et de fin \\[{1}+ et \\]{1}+
    et le reste du classiques ([a-zA-Zespace&&[^:#&&[^\\)\\]]]]){2,}, je pense que l'on peut optimiser cette partie....
    Si qq à une suggestion je suis preneur ...

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Pour la regex qui matche toutes les lignes qui contiennent [.......] il suffit de faire çà:

    Si c'est pas ça que tu cherche, explicite un peu, tes messages sont assez obscurs

  4. #4
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Par défaut si tu le dis
    Je te remercie ...
    En faite je veux créer une méthode qui me permet de reconnaitre des lignes spécifiques :
    Ex: [Mail] pour reconnaitre cette ligne, il que j'ai un crochet et pas plus en début de ligne, des caracatères avec ou sns espaces entres ces crochets et un crochet de fermeture .
    possibilité : [Mail], [ Mail ], [Mail ], [ Mail] .
    D'ou cette regex :

    ^[\\[]{1}+([a-zA-Z &&[^:#&&[^\\)\\]]]]){2,}[\\]{1}+]$

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    La regexp de tchize_ me semble tout à fait convenir au problème ou alors je ne l'ai pas compris !

    flexDev : Ta regexp est incompréhensible !
    Décompose clairement ton problème et retranscrit le petit à petit, que ce soit en français ou en regexp.

    a++

  6. #6
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Par défaut Explication de ma regex
    possibilité : [Mail] ou [ Mail ] ou [Mail ] ou [ Mail] .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^[\\[]{1}+([a-zA-Z &&[^:#&&[^\\)\\]]]]){2,}[\\]{1}+]$
    Comme je veux parcourir toute ma chaîne, j'ai mis ^pour indique le début de la ligne et $ pour indiquer la fin de ma ligne.

    Ensuite comme je veux un crochet en début de ligne
    ^[\\[]{1}+$
    Puis entre les crochets, j'ai les possibilités citées au dessus [ Mail ], il des caractères avec ou sans espaces.
    D'ou cette partie : ([a-zA-Z &&[^:#&&[^\\)\\]]]]){2,}, si on décompose
    [^\\)\\]] -> pas ce type )]
    ^:# - > et pas ces caractères .
    a-zA-Z - tout types de textes, avec un minimum de 2 caractères.
    D'ou les parenthèses (...){2,}
    ce n'est pas évident de faire passer son idée, j'espère que c'est clair ???
    L'exemple est bon, mais j'y est mis plus de restrictions...

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par flexDev Voir le message
    Ensuite comme je veux un crochet en début de ligne
    ^[\\[]{1}+$
    Tu te compliques déjà : ^\\[
    Début de ligne suivi du caractères simple [ (protégé par \\ sinon il est interprété.

    Citation Envoyé par flexDev Voir le message
    Puis entre les crochets, j'ai les possibilités citées au dessus [ Mail ], il des caractères avec ou sans espaces.
    D'ou cette partie : ([a-zA-Z &&[^:#&&[^\\)\\]]]]){2,}, si on décompose
    [^\\)\\]] -> pas ce type )]
    ^:# - > et pas ces caractères .
    a-zA-Z - tout types de textes, avec un minimum de 2 caractères.
    D'ou les parenthèses (...){2,}
    Là encore c'est très compliqué...

    Tu as deux choix : soit tu définis tous les caractères autorisés, par exemple si tu veux seulement les lettres et les espaces : [A-Za-z ]{2,}.
    A noté que tu peux également utiliser \\p{L} qui correspond à toutes les lettres y compris accentués, et \\s qui correspond à toutes formes d'espaces (y compris tabulation) : ([\\p{L}\\s]{2,}


    Soit tu définis tous les caractères interdits : ^:# et ]
    Ce qui revient à faire ceci : [^\\^\\]:#]{2,}


    Enfin il suffit de finir par le caractère ] en fin de ligne : \\]$, ce qui donnerait au final quelque chose comme cela selon tes besoins :
    • ^\\[[^\\^\\]:#]{2,}\\]$
    • ^\\[[A-Za-z ]{2,}\\]$
    • ^\\[[\\p{L}\\s]{2,}\\]$



    Citation Envoyé par flexDev Voir le message
    ce n'est pas évident de faire passer son idée, j'espère que c'est clair ???
    Pas tout à fait : à toi de décider ce qui doit être compris entre les crochets...


    a++

  8. #8
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Par défaut
    Bon je te remercie..
    je vais tester tout ça ..En faite j'ai d'autres types à écrire d'où la restriction. sur cette regex [\\[]{1}+.Mais comme tu dis il faut rester simple et penser simple.
    Salut

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Si tu veux entrer directement des caractères sans avoir à gérer leur valeur, utilise le Pattern.quote();

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    String caractèresInterdits = "[]()^:#";
     
    String regex = 
       "^" // Début de ligne
     + Pattern.quote("[") // On veut un crochet
     + "\\s*" // puis un nombre quelconque d'espaces en tous genres
     + "[^" // Nouveau groupe de caractères sans ceux interdits
       + Pattern.quote(caractèresInterdits);
     + "]{2,}" // Et on en veut au moins deux
     + "\\s*" // Encore des espaces
     + Pattern.quote("]") // Crochet de fin
     + "$"; // Fin de ligne.

  10. #10
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Par défaut
    Merci dingoth..
    je préfère cette solution, car elle est ouverte et la relecture sera plus simple..

    En tous cas merci les gars pour votre, expertise .

    Salut

  11. #11
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    +1 ton découpage de la regexp la rend vraiment très lisible !

    a++

  12. #12
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Bah bien sûr : construire une regex comme ça, faut être fou, ou sacrément doué ! Il y a toujours une structure logique dans une regex. Il faut juste la trouver. Mettre une règle par ligne et utiliser l'indentation aide toujours.

    C'est comme en java :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    import java.util.*;public class MaClasse extends Properties{public MaClasse(){super();this.put("key","value");}}
    est moins lisible que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import java.util.*;
    public class MaClasse
    		extends Properties {
    	public MaClasse () {
    		super();
    		this.put("key","value");
    	}
    }
    Pourtant c'est le même code !

    On peut éventuellement utiliser le modificateur 'x' pour commenter directement dans l'expression régulière et écrire les regex sur plusieurs lignes.

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

Discussions similaires

  1. Regex en java dans un tmap
    Par Scorff dans le forum Développement de jobs
    Réponses: 7
    Dernier message: 15/11/2010, 11h52
  2. Regex en Java (ordre d'apparition)
    Par sampaiX dans le forum Entrée/Sortie
    Réponses: 8
    Dernier message: 29/06/2010, 13h38
  3. Convert C# RegEx to Java RegEx
    Par hbespoir2003 dans le forum Développement Web en Java
    Réponses: 0
    Dernier message: 17/06/2010, 23h31
  4. Document sur les REGEX en Java
    Par sampaiX dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 02/06/2010, 20h10
  5. Probleme algo ou regex en java
    Par ox@na dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 24/06/2008, 20h52

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