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

Java Discussion :

Extraire partie d'une chaine identifié par un pattern


Sujet :

Java

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 166
    Points
    166
    Par défaut Extraire partie d'une chaine identifié par un pattern
    Bonjour,

    Je voudrais, à partir d'une chaine de caractère contenant par exemple "intersection A36 sortie 2" ou "Direction RN66 sur 2km" sortir "A36" ou "RN66", en gros sort moi le bout de texte qui correspond à "A" suivi de x chiffre(s) ou "RN" suivi de x chiffre(s), ou plus générique sort moi ce qui correspond à 1 ou 2 caractères entre A et Z suivi de x chiffre(s).

    J'ai regardé du coté des expressions régulières, j'ai bien trouvé comment sortir un texte contenu entre deux autres textes, mais pas trouvé grand chose pour mon problème. De plus je n'utilise pas souvent les expressions régulière donc si quelqu'un qui a de l'expérience sur ce sujet peux me répondre...

    Cordialement.

  2. #2
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Un truc comme ça devrait répondre à ta problématique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	public static void main(String[] args) throws SQLException, IOException, ParseException {
    		testRegexp("Direction RN66 sur 2km", "\\w+\\s(\\w+)\\s");
    		testRegexp("intersection A36 sortie 2", "\\w+\\s(\\w+)\\s");
    	}
     
    	public static void testRegexp(String input, String pattern){
    		Pattern p = Pattern.compile(pattern);
            Matcher m = p.matcher(input);
            while (m.find()){
            	System.out.println(m.group(1));
            }
    	}
    Je ne suis pas mort, j'ai du travail !

  3. #3
    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 Mercenary Developer Voir le message
    ou plus générique sort moi ce qui correspond à 1 ou 2 caractères entre A et Z suivi de x chiffre(s).
    Cette Pattern devrai faire l'affaire


  4. #4
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 166
    Points
    166
    Par défaut Cela fonctionne.
    Bonjour,

    merci beaucoup, les 2 patterns "([A-Z]{1,2}[0-9]+)" (j'ai supprimé le [a-z] car les lettres sont toujours en majuscules) et "\\w+\\s(\\w+)\\s" fonctionnent. Je comprend un peu près la premiere:

    [A-Z] une lettre de A à Z
    {1,2} une ou deux lettres maximum
    [0-9] suivi de chiffres entre 0 et 9
    et le + pour spécifier qu'il peut y avoir un nombre non limité de chiffre, contrairement aux accolades pour les lettres.

    Par contre la deuxième pattern, si quelqu'un peut me donner la signification...

    Cordialement.

  5. #5
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    \w : ça représente le caractère d'un mot, ça équivaut à [A-Za-z_0-9]
    Du coup, \w+ -> un mot complet (depuis le début jusqu'au premier caractère qui n'est pas un mot)
    \s : un espace
    \w+\s -> un mot suivi d'un espace

    Du coup je demande
    \w+\s\w+\s -> un mot, un espace, un mot, un espace
    Et ensuite, je "capture" le mot qui m'intéresse
    \w+\s(\w+)\s -> c'est le mot entre parenthèses qui m'intéresse (groupe de capture numéro 1)


    le + pour spécifier qu'il peut y avoir un nombre non limité de chiffre, contrairement aux accolades pour les lettres.
    Pour être exact, ça veut dire qu'il y a au moins une occurrence : 1,n
    les autres choix sont
    * : 0,n
    ? : 0,1
    Je ne suis pas mort, j'ai du travail !

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 166
    Points
    166
    Par défaut Ah oui mais non :)
    Bonjour,

    Vous n'avez pas compris ma problèmatique Eulbobo, en fait je ne veux pas prendre le premier mot qui suis un mot et un espace, je veux trouver les mots qui commencent par un ou deux caractères en majuscule suivi d'un chiffre de x nombre !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Pattern p = Pattern.compile("([A-Z]{1,2}[0-9]+)");
    Matcher m = p.matcher("A36 blablabla A123 bliblibli RN222");
    while ( m.find() )
    {
    	System.out.println ( "["+m.group(1)+"]" );
    }
    Me renvoi bien:

    [A36]
    [A123]
    [RN222]

    Alors qu'avec le pattern "\\w+\\s(\\w+)\\s" il me donne:

    [blablabla]
    [bliblibli]

    En gros je veux détecter les noms des routes ou autoroutes dans une chaine de caractère.

    Merci quand même pour votre aide !

    Cordialement !

  7. #7
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    J'ai compris la problématique à la hauteur des exemples donnés qui illustraient le propos ^^
    A savoir, dans tous les exemples, la donnée intéressante était le deuxième mot !

    :p
    Je ne suis pas mort, j'ai du travail !

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

Discussions similaires

  1. [RegExp] Extraire partie d'une chaine .. je galère ..
    Par camyo dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/04/2011, 16h31
  2. Réponses: 10
    Dernier message: 06/03/2008, 15h12
  3. Réponses: 5
    Dernier message: 04/07/2007, 18h31
  4. Réponses: 7
    Dernier message: 18/07/2006, 14h56
  5. Réponses: 2
    Dernier message: 21/05/2006, 19h31

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