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 :

substring avec un regex


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2002
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 101
    Par défaut substring avec un regex
    Bonjour,

    J'ai une string qui peut prendre les formes suivantes :
    - VHF1234567HF1234
    - HF1234VHF1234567
    - VHF1234657
    - HF1324

    et je voudrais récupérer les valeurs de VHF (1324567) qui est forcement sur 7 digits et de HF (1234) qui est forcement sur 4 digits.

    Je peux me débrouiller avec des substring, indexOf ect. mais je voulais savoir si je pouvais pas faire mieux avec des regex...

    je voudrais utiliser les regex VHF[0-9]{7} et HF[0-9]{4} pour récupérer les chaînes VHF1234657 et HF1324 puis les valeurs (en supposant que les regex sont bonnes)

    j'ai regardé StringTokenizer, Pettern, Matcher mais ça correspond pas

    une idée ?

    Merci de votre aide

    Obélix

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    // appeler ce fichier Test.java
     
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
     
    public class Test {
     
        public static void main(String[] args) {
            String s = "HF1234VHF1234567";
            Pattern p = Pattern.compile("VHF([0-9]{7})");
            Matcher m = p.matcher(s);
            if (m.find()) {
                System.out.println(m.group()); // VHF1234567
                System.out.println(m.group(1)); // 1234567
                // group(1) renvoie le premier groupe de parenthèses 
            }
        }
    }
    Nicolas

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2002
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 101
    Par défaut
    hey merci beaucoup, cela fonctionne déjà mieux

    C'est justement les histoires des groupes que j'avais du mal à comprendre !

    Cependant il reste un problème : le pattern HF([0-9]{4}) et inclu dans le pattern VHF([0-9]{7})

    du coup pour la string "VHF1234567", il me sort deux fois :
    - VHF1234567
    - HF1234

    voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    	private void method(String str) {
    		System.out.println("====>> " + str);
    		Pattern patternVHF = Pattern.compile("VHF([0-9]{7})");
    		Matcher matcherVHF = patternVHF.matcher(str);
    		if (matcherVHF.find()) {
    			System.out.println("==>> VHF : " + matcherVHF.group());
    			System.out.println("==>> VHF : " + matcherVHF.group(1));
    		}
     
    		Pattern patternHF = Pattern.compile("HF([0-9]{4})");
    		Matcher matcherHF = patternHF.matcher(str);
    		if (matcherHF.find()) {
    			System.out.println("==>> HF : " + matcherHF.group());
    			System.out.println("==>> HF : " + matcherHF.group(1));
    		}
    	}
    j'ai essayé en utilisant les pattern "VHF([0-9]{7})HF([0-9]{4})" puis "HF([0-9]{4})/VHF([0-9]{7})" ce qui fonctionne bien.

    par contre il reste le problème de l'inclusion : si je passe la string "VHF1234567" avec le pattern HF([0-9]{4}) il sort HF1234

    Merci de votre aide

    ça avance...

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2002
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 101
    Par défaut
    bon je viens de trouver

    voici les string de tests (j'ai rajoute un "/") :
    - "VHF1234567/HF1979"
    - "HF1979/VHF1234567"
    - "VHF1234567"
    - "HF1979"
    - "VHF12345678"
    - "HF19799"

    et j'ai une méthode qui applique 4 patterns :
    - "^VHF([0-9]{7})/HF([0-9]{4})$"
    - "^HF([0-9]{4})/VHF([0-9]{7})$"
    - "^HF([0-9]{4})$"
    - "^VHF([0-9]{7})$"


    ceci me permet de couvrir tous les cas !

    voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    	private void method(String str) {
    		System.out.println("====>> " + str);
    		Pattern pattern = Pattern.compile("^VHF([0-9]{7})/HF([0-9]{4})$");
    		Matcher matcher = pattern.matcher(str);
    		if (matcher.find()) {
    			System.out.println("==>> VHF : " + matcher.group(1));
    			System.out.println("==>> HF : " + matcher.group(2));
    		}
     
    		pattern = Pattern.compile("^HF([0-9]{4})/VHF([0-9]{7})$");
    		matcher = pattern.matcher(str);
    		if (matcher.find()) {
    			System.out.println("==>> HF : " + matcher.group(1));
    			System.out.println("==>> VHF : " + matcher.group(2));
    		}
     
    		pattern = Pattern.compile("^HF([0-9]{4})$");
    		matcher = pattern.matcher(str);
    		if (matcher.find()) {
    			System.out.println("==>> HF : " + matcher.group(1));
    		}
     
    		pattern = Pattern.compile("^VHF([0-9]{7})$");
    		matcher = pattern.matcher(str);
    		if (matcher.find()) {
    			System.out.println("==>> VHF : " + matcher.group(1));
    		}
    	}
    dernière question : est il possible de mutualiser les patterns "^VHF([0-9]{7})/HF([0-9]{4})$" et "^HF([0-9]{4})/VHF([0-9]{7})$"

    encore merci

  5. #5
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Il est possible de s'en sortir avec une seule expression régulière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private void method(String str) {
        System.out.println("====>> " + str);
        Pattern pattern = Pattern.compile("(((?<=[^V])|^)HF(\\d{4}))|(VHF(\\d{7}))");
        Matcher matcher = pattern.matcher(str);
        while(matcher.find()) {
            if(matcher.group().startsWith("V")) {
                System.out.println("==>> VHF : " + matcher.group(5));
            } else {
                System.out.println("==>> HF : " + matcher.group(3));
            }
        }
    }
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2002
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 101
    Par défaut
    ah ben là je décroche

    j'ai testé et il reste un petit problème pour les string HF1979A ou VHF12345678 par exemple

    je vais essayer de comprendre pour la forme mais je vais garder le code ci dessous

    Merci de votre aide !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    	private void method(String str) {
    		Pattern pattern = Pattern.compile("^VHF([0-9]{7})HF([0-9]{4})$");
    		Matcher matcher = pattern.matcher(str);
    		if (matcher.find()) {
    			System.out.println("==>> VHF : " + matcher.group(1));
    			System.out.println("==>> HF : " + matcher.group(2));
    		} else {
    			pattern = Pattern.compile("^HF([0-9]{4})VHF([0-9]{7})$");
    			matcher = pattern.matcher(str);
    			if (matcher.find()) {
    				System.out.println("==>> HF : " + matcher.group(1));
    				System.out.println("==>> VHF : " + matcher.group(2));
    			} else {
    				pattern = Pattern.compile("^HF([0-9]{4})$");
    				matcher = pattern.matcher(str);
    				if (matcher.find()) {
    					System.out.println("==>> HF : " + matcher.group(1));
    				} else {
    					pattern = Pattern.compile("^VHF([0-9]{7})$");
    					matcher = pattern.matcher(str);
    					if (matcher.find()) {
    						System.out.println("==>> VHF : " + matcher.group(1));
    					} else {
    						System.out.println("==>> Doesn't match !!!!!!!!");
    					}
    				}
    			}
    		}
    	}

  7. #7
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Citation Envoyé par obelix Voir le message
    ah ben là je décroche

    j'ai testé et il reste un petit problème pour les string HF1979A ou VHF12345678 par exemple
    Ben c'est normal puisque ces chaînes de caractères ne correspondent pas au format que tu as décris à savoir : HF suivi de 4 chiffres ou VHF suivi de 7 chiffres .
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

Discussions similaires

  1. [RegEx] Problème avec une ReGex
    Par Death83 dans le forum Langage
    Réponses: 9
    Dernier message: 27/07/2006, 21h27
  2. [RegEx] Problème avec les regex
    Par dragon noir dans le forum Langage
    Réponses: 3
    Dernier message: 24/07/2006, 11h26
  3. Problème avec une RegEx
    Par Death83 dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 26/05/2006, 14h03
  4. Problem avec un REGEX
    Par Death83 dans le forum Langage
    Réponses: 1
    Dernier message: 23/12/2005, 22h36
  5. [RegEx] Pb traitement de chaînes avec les regex
    Par Invité dans le forum Langage
    Réponses: 2
    Dernier message: 25/09/2005, 00h00

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