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 : Unimplemented feature


Sujet :

Collection et Stream Java

  1. #1
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut Regex : Unimplemented feature
    Bonjour à tous,

    je suis entrain d'essayer de valider la saisie d'une plaque minéralogique.
    Comme vous le savez les nouvelles plaques sont du format AA000AA , avec quelques limitation sur les lettres du début et de fin (pas de SS et WW).

    J'ai donc essayé la REGEX suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^(?(?!SS|WW)[A-HJ-NP-TV-Z]{2})[0-9]{3}(?(?!SS)[A-HJ-NP-TV-Z]{2})$
    Comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String pattern = "^(?(?!SS|WW)[A-HJ-NP-TV-Z]{2})[0-9]{3}(?(?!SS)[A-HJ-NP-TV-Z]{2})$";
    String testStr = "AA000AA";
    Pattern.matches(pattern,testStr);
    A priori la regex fonctionne : http://regex101.com/r/hF7dH3

    Mais Java me retourne une exception au niveau du Negative lookahead :

    06-18 14:21:37.243: W/System.err(7528):
    java.util.regex.PatternSyntaxException: Use of unimplemented feature near index 4:
    06-18 14:21:37.244: W/System.err(7528): ^(?(?!SS|WW)[A-HJ-NP-TV-Z]{2})[0-9]{3}(?(?!SS)[A-HJ-NP-TV-Z]{2})$
    06-18 14:21:37.245: W/System.err(7528): ^
    Une idée de ce qui cause le problème et de comment le résoudre ?

    Merci

    Edit--
    En épluchant la doc j'ai trouvé la raison :
    Une des synthaxe non supportée :
    The conditional constructs (?(condition)X) and (?(condition)X|Y),
    Du coup quel est la solution pour passer outre ?
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  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
    Bonjour,

    La bonne solution c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String patternLetters = "[A-HJ-NP-TV-Z]{2}"; // alternative : "[A-Z&&[^IOU]]{2}"
    String pattern = patternLetters + "[0-9]{3}" + patternLetters;
    if(plaque.matches(pattern) && !plaque.startsWith("WW") && !plaque.contains("SS")) {
    Les ^ et $ sont sans doute le cargo cult habituel, donc servent à rien, et ce code est bien plus sûr que qu'une monstrueuse regex illisible.


    La solution à base de monstrueuse regex illisible qu'aucun audit digne de ce nom n'accepterait, c'est :
    Les parenthèses autour de SS ou WW : c'est l'un ou l'autre qu'on veut exclure.
    Et les (? ... ) ne servent à rien, autant les virer, ce sera toujours ça de clutter en moins.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti Avatar de toutgrego
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2013
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2013
    Messages : 217
    Points : 350
    Points
    350
    Par défaut
    Salut,

    c'est juste une idée un peu lourde, mais tu peux peut-être tenter de séparer la regex en deux. Avec une qui exclue les plaque dont tu ne veux pas.

    Tchao!
    F*ck it ! Do it !

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

Discussions similaires

  1. [Regex] Plusieurs motifs
    Par sissi_l dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 29/06/2004, 14h15
  2. [jakarta][regex]Matcher mot en entier.
    Par thibaut dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 26/05/2004, 13h33
  3. [Regex] Vérifier qu'une chaîne respecte une expression régulière
    Par PeteMitchell dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 13/05/2004, 14h22
  4. [regex][string] replaceAll bogué ?
    Par 7eme dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 13/11/2003, 16h36
  5. Cherche regex...
    Par laurent_h dans le forum C
    Réponses: 4
    Dernier message: 31/03/2003, 11h24

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