Expression régulière avec un suffixe optionnel

Résolu/Fermé
KX - 11 juil. 2017 à 13:35
 Utilisateur anonyme - 12 juil. 2017 à 23:49
Bonjour,

Je sèche sur une expression régulière à première vue assez simple mais je ne vois pas comment le faire...

J'ai un code qui peut avoir deux formes :
PREFIX_CODE
ou
PREFIX_CODE_SUFFIX
.
Je veux récupérer le code et savoir si le suffixe est présent.

Mon expression régulière actuelle :
^PREFIX_(.+)(_SUFFIX)?$


Problème : dans le cas où le préfixe est présent
(.+)
va récupérer
CODE_SUFFIX
!
Du coup le code est faux et l'indication sur la présence du suffixe aussi...

Remarque :
PREFIX_
et
_SUFFIX
sont des variables dans le programme.
pattern = Pattern.compile(Pattern.quote(prefix) + "(.+)(" + Pattern.quote(suffix) + ")?$");

Est-ce que vous avez une idée ? (simple si possible)

Merci.

1 réponse

Utilisateur anonyme
11 juil. 2017 à 13:57
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
11 juil. 2017 à 14:05
Salut,

Le problème c'est que je ne peut pas être sûr que le code ne contiendra jamais des _ et en plus je ne suis pas sûr non plus que la première lettre du suffixe sera toujours _
0
Utilisateur anonyme
12 juil. 2017 à 01:14
Ha si tu ne dis pas tout, comment veux tu qu'on s'en sorte.
Peux tu être plus précis sur ce que peut ou pas être chaque partie du texte?
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019 > Utilisateur anonyme
12 juil. 2017 à 08:28
En fait cette contrainte je l'avais exposé en disant que PREFIX et SUFFIX étaient des variables, ce qui explique que je ne sais pas ce qu'elles contiennent.

Cependant ce n'est pas tout à fait exact, car SUFFIX est figé, bien qu'il puisse avoir deux formes
[_\-]PLOP
. Par contre pour le reste, champs texte libre...

pattern = Pattern.compile(Pattern.quote(prefix) + "(.+)([_\-]PLOP)?$");

Exemples avec
prefix="ABC-"
par exemple (parce que le problème n'est pas là)
ABC-DEF_GHI-JKL-PLOP => ["DEF_GHI-JKL", "-PLOP"]
ABC-DEF_GHI-JKL_PLOP => ["DEF_GHI-JKL", "_PLOP"]
ABC-DEF_GHI-JKL => ["DEF_GHI-JKL", ""]
ABC-DEF_GHI-PLOP-JKL => ["DEF_GHI-PLOP-JKL", ""]
Bonne journée.
0
Utilisateur anonyme > KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024
12 juil. 2017 à 16:55
salut, je n'ai pas trop eu le temps d'y regarder aujourd'hui et ce soir ça va être compliqué.
Je m'y remets demain, je pense que la solution viendra avec des "lookahead assertion"
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019 > Utilisateur anonyme
Modifié le 12 juil. 2017 à 18:34
Je viens de regarder les "lookahead assertion" que je ne connaissais pas du tout et effectivement ça permet de résoudre mon problème en rajoutant un
(?<!SUFFIX)
pour garantir que le
(.+)
ne termine pas par
SUFFIX
:

Pattern.compile(Pattern.quote(prefix)+"(.+)(?<!"+suffix+")("+suffix+")?$");

Merci :-)
0