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 :

Regex et occurence impair


Sujet :

Java

  1. #1
    Membre à l'essai
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 44

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 22
    Points : 16
    Points
    16
    Par défaut Regex et occurence impair
    Bonjour,
    Dans le langage que je parse, le ? est le caractère d'échappement. Et ' est un caractère de fin de ligne.
    Ainsi ?' est un simple quote classique. Mais du coup ??' est un ? suivi d'une fin de ligne.

    Jusqu'à présent j'utilisais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pattern p = Pattern.compile("(?<!" + Pattern.quote("?") + ")'");
    qui match correctement dans le cas d'un seul ? mais qui ne fonctionne plus dans le cas ??' ne ????', etc.

    J'ai beau trituré ça dans tous les sens et cherché un peu partout, je ne trouve pas de solution en une seule regex.
    Je suis preneur de solution, d'idées ou même de pistes.

    Merci d'avance,
    AsH.fr

  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
    Ouais enfin les regex commencent à montrer leurs limites quand tu en arrives là. Il arrive un moment où il faut juste écrire un parseur.

    Mais bon, pour ce cas précis il y a une astuce : Il faut chercher les ' qui ont zéro ou plusieurs fois ?? devant eux. Et un negative lookbehind qui interdit d'avoir un ? unique devant le tout.
    La regex va donc chercher à lire les ? par paires, autant de fois que possible. Et s'il en reste un qui n'a pas été apparié, il est devant tout ceux qui ont été lus, et le negative lookbehind rejette le tout.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre à l'essai
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 44

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    En fait, après avoir chercher un bon moment, je post et 30minutes plus tard, je trouve une solution qui semble convaincante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pattern.compile("(?<!\\?)((?:\\?\\?)*)'");
    Je planchais sur cette solution, mais j'écrivais tout à l'envers.
    En tout cas merci thelvin de t'être penché sur le problème
    Je teste en réel et post ou non la résolution de l'affaire

  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
    Ouais ouais, c'est ce que j'ai dit. Bon, y a deux parenthèses qui servent à rien et le non-capturing group est inutile, mais bon.
    En simplifié ça donne ça (pas si simple quand même

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre à l'essai
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 44

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    Bon, effectivement ça fonctionne bien.
    Les parenthèses et le non capturing ne servent pas dans l'énoncé de mon problème. Par contre, dans mon besoin réel si. J'ai juste oublié de les enlevés pour le post

    En tout cas, merci.

    Voilà une bonne chose de faite !

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

Discussions similaires

  1. [Regex c#] Arret a la premiere occurence trouvée
    Par guromgd dans le forum Général Dotnet
    Réponses: 8
    Dernier message: 20/04/2009, 08h29
  2. Réponses: 2
    Dernier message: 14/04/2009, 16h01
  3. Regex et multiples occurences
    Par jamesb dans le forum Général Python
    Réponses: 3
    Dernier message: 12/01/2008, 12h52
  4. Récupérer toutes les occurences d'une regex ?
    Par ViRouF dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 26/01/2007, 10h40
  5. [RegEx] Regex : récupérer toutes les occurences dans une chaîne
    Par Poulpynette dans le forum Langage
    Réponses: 1
    Dernier message: 10/10/2006, 10h14

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