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 :

Recherche expression réguliere


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Par défaut Recherche expression réguliere
    Bonjour,
    je suis bloquer sur une expression régulière. Voila le type de données que je doit découper dans un tableau:

    1 8654 "server 1 "" dte" d"st " 1
    (Exemple de message mais peux avoir aussi plusieurs bloc de type "")

    Je cherche a obtenir le résultat suivant :
    [1][8654]["server1 "" dte" d"st "][1]

    Pour découper la chaîne en fonction des espaces il n'y a pas de problème
    (split("\\s+)) mais pour le bloc "..." c'est plus compliquer.

    le but c'est d'identifier les blocs de type " ... en fonction du 1er " et du dernier " car dans ce bloc il peux y a voir des " et dans une chaine il peux avoir plusieur bloc de type "".

    Si une personne a la réponse ^^

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 288
    Par défaut
    Sois un peu plus calir dans ta question. On y verra aussi plus clair.
    Exemple j'ai les données suivantes ......... dans mon tableau et je veux avoir le résultat suivant....... Prblème.....
    Merci de lire les règles du forum et surtout celle là Message clair et précis.
    Evitons les ctrl c ctrl v => Ne sortons pas les codes de leur contexte sinon ça ne marche pas.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Par défaut
    Exemple de message reçu:

    id codec parent order maxusers name flags password topic
    1 9 -1 32000 16 "NAME test "d" " 24 0 "Topic DDFD"

    J'ai une ArrayList<String> tab qui contiens ces 2 lignes.
    tab.remove(0); // je suprime la ligne d'explication (id codec parent ...)

    Après je doit découper la ligne suivant en bloc pour pouvoir ensuite donner les valeurs a mes objets.

    Si je fait :
    String[] data = tab.get(0).split("\\s+");
    Je crée un tableau qui decoupe en fonction des espaces. Mais ce n'est pas bon car le tableau renvoyer :
    [1] [9] [-1] [32000] [16] ["NAME] [test] ["d"] ["] [24] [0] ["Topic] [DDFD"]
    Et il me faut :
    [1] [9] [-1] [32000] [16] ["NAME test "d" "] [24] [0] ["Topic DDFD"]

    J'espère que mon exemple est plus clair ^^

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 288
    Par défaut
    J'ai une idée mais je ne sais pas si c'est adapté à ton problème. Déjà je pense que tu es dans un traitement de signaux audio ou vidéo.

    Premièrement: je suppose que tu as toujours le même format de message avec le même nombre d'espace.

    A ton place, après ton "split", je ferais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    créer un nouveau tableau
    Créer un nouvelle chaîne de caractère
    newChaine  =data[5].replace("]"," "); 
    autreChaine=date[6].replace("["," ");
    newChaine = newChaine+autreChaine.replace("]"," "); 
    autreChaine=date[7].replace("["," ");
    newChaine = newChaine+autreChaine.replace("]"," "); 
    newChaine = newChaine+data[8].replace("["," ");
    C'est une solution mais je pense qu'il y'a mieux!!! En plus comme tu passes par des valeurs intermédiaires cela rajoute du temps d'exécution donc si tu veux faire du temps réel c'est chaud!!!!
    Merci de lire les règles du forum et surtout celle là Message clair et précis.
    Evitons les ctrl c ctrl v => Ne sortons pas les codes de leur contexte sinon ça ne marche pas.

  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,


    C'est normal que le découpage par split() ne puisse pas marcher car tu ne peux pas différencier les espaces "normaux" des espaces entres deux les quotes...

    En fait il faut prendre le problème dans l'autre sens et rechercher les séquences au lieux de rechercher les espaces.

    D'après ce que je peux comprendre, tu peux avoir deux sortes de séquences :
    • Des séquences "standard" qui représente des mots ou des chiffres court, que l'on pourrait traduire par "n'importe quelle suite de caractères sauf un blanc ou une quotes", ce qui se traduit en regexp par : [^\\s\"]+
    • Des séquences contenant une phrase entre deux quotes, que l'on peut traduire par "n'importe quelle suite de caractères entre deux quotes", ce qui peut se traduire en regexp par : \"[^\"]+\"


    Donc ton pattern de recherche devrait comprendre l'un ou l'autre au choix : ([^\\s\"]+)|(\"[^\"]+\")

    Et comme il semble que tu "colle" deux séquences différentes lorsqu'elles ne sont pas séparé par un blanc, au final cela donnerait ceci : (([^\\s\"]+)|(\"[^\"]+\"))+


    Ensuite il ne reste plusqu'à utiliser Pattern et Matcher pour rechercher les séquences :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	public static List<String> getWords(String text) {
    		ArrayList<String> list = new ArrayList<String>();
    		Pattern pattern = Pattern.compile( "(([^\\s\"]+)|(\"[^\"]+\"))+" );
    		Matcher matcher = pattern.matcher(text);
     
    		while (matcher.find()) {
    			list.add(matcher.group());
    		}
    		list.trimToSize();
    		return list;
    	}
    a++

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Par défaut
    Je viens d'effectuer un test et cela fonctionne ^^

    Merci de votre aide.

  7. #7
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Moi je dirais... ".+"|\S+

    Clair, non ? (du moins par rapport au premier)

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Par défaut
    J'ai effectuer un test mais cela ne marche pas avec ce regex :/

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

Discussions similaires

  1. faire une expression réguliere dans rechercher remplacer
    Par fred0655 dans le forum Dreamweaver
    Réponses: 15
    Dernier message: 10/07/2011, 19h49
  2. [Debutant] Expression réguliere
    Par grizzz dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 17/08/2007, 17h14
  3. expression réguliere
    Par htristra dans le forum C
    Réponses: 11
    Dernier message: 06/09/2005, 23h33
  4. expression réguliere en c++
    Par alambics dans le forum MFC
    Réponses: 9
    Dernier message: 10/03/2004, 21h19
  5. expression réguliere
    Par alambics dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/03/2004, 14h52

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