jeudi 29 avril 2010

java : petit rappel sur les regex

Voici, un exemple de code qui fonctionne, à noter les double slash ... un pour le \b et 1 de plus car on est dans une String java ...

1) tout d'abord, on compile le pattern souhaité
Pattern patternCtrlGenAnnule = Pattern.compile("(\\b" + ServiceMetier.CTRL_GEN_ANNULE + "\\b)");

2) puis après on essaie de matcher une string :
Matcher matcherCtrlGenAnnulle = patternCtrlGenAnnule.matcher(valeur);

3) puis, on fait un find pour savoir si le pattern a été trouvé ...
matcherCtrlGenAnnulle.find()

4) il est possible de récupérer le token, via :
valeur.substring(matcher.start(),matcher.end())
ou la method :
matcher.group();

PS: a noter que la methode matches ne retourene true que si la regex matchecomplèteement.

De plus, il est parfois plus facile, de faire la negation de la chaine recherché pour vérifier quelle est conforme, par exemple:

String regexpNegative = "^((\\bCTRL_GEN_ACTION\\b)|(\\bCTRL_GEN_VERSION\\b)"


public static void une methode()
{
private final static Pattern patternCtrlGenAnnule = Pattern.compile("(\\b" + ServiceMetier.CTRL_GEN_ANNULE + "\\b)");

Matcher matcherCtrlGenAnnulle = patternCtrlGenAnnule.matcher(valeur);

if (matcherCtrlGenAnnulle.find())
{
if (sLog.isDebugEnabled())
{
logMethodesQuiMatches(valeur, matcherCtrlGenAnnulle, ServiceMetier.CTRL_GEN_ANNULE);
}
if (hasAuMoinsUneCommandeAnnulee(commandes))
{
/**
*le controle doit etre applique, mais les condition ne sont pas remplie => on sort
* et on retourne
* Boolean.FALSE
*/
return Boolean.FALSE;
}
}
}

Aucun commentaire:

Enregistrer un commentaire