Expressions regulieres (regex)

Résolu
CS-Tual Messages postés 15 Date d'inscription mercredi 25 mai 2011 Statut Membre Dernière intervention 20 mai 2016 - 7 nov. 2013 à 16:49
CS-Tual Messages postés 15 Date d'inscription mercredi 25 mai 2011 Statut Membre Dernière intervention 20 mai 2016 - 8 nov. 2013 à 10:18
Bonjour,

Je travail actuellement sur la récupération de "morceaux de chaînes" contenus dans une chaine de caractère.

exemples de chaîne : "Rule(maRegle1) + Rule(maRegle2) == Rule(maRegle3)"
Le nombre de fois qu'apparaît l'expression "Rule(maReglen)" peut varier (apparaître 1 à autant de fois que l'on souhaite).

Mon objectif : uniquement récupéré les paramètres, ou règles, de Rule (soit : maRegle1, maRegle2, ...).

J'ai déjà trouvé une solution qui fonctionne pour le moment, mais c'est assez moche.

String stringExpression = "Rule(maRegle1) + Rule(maRegle2) == Rule(maRegle3)";
// on crée une liste qui recevra le nom des règles
List<String> listRulesNames = new ArrayList<String>();

// on split stringExpression à chaque fois qu'une parenthese se ferme
String[] stringExpressions = StringUtils.splitNoRegEx(stringExpression, ")");
// pour chaque "sous expression" ...
for (int i = 0 ; i < stringExpressions.length ; i++)
{
//si elle contient au moins une fois Rule(
if (stringExpressions[i].contains("Rule("))
{
//on supprime tous les caractères se trouvant avant Rule(
Pattern pattern = Pattern.compile("Rule(.*)");
Matcher matcher = pattern.matcher(stringExpressions[i]);
while (matcher.find())
{
// on obtient plus que le nom de la règle, que l'on vient ajouter dans la liste des règles
listRulesNames.add(matcher.group(1).substring(1));
}
}
}


L'idéal pour moi serait de réussir à trouver le pattern idéal, qui permet de récupérer toutes les règles sans avoir à découper mon expression.

Sinon, je me posais une question, les patterns sont-ils très exigeant par rapport à la syntaxe de l'expression à laquellle il s'applique.

Merci d'avance.

1 réponse

nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
7 nov. 2013 à 17:13
salut !

L'expression régulière qui t'interessera sera (je pense) :

 
Rule\((.*?)\)


à noter que dans un string, il faudra doubler les '\' car c'est un echappement regex et non string (il faut donc echapper le string pour que l'echapement regex soit pris en compte.)

Tu peux les tester ici :
http://www.myregextester.com/index.php

où tu trouvera la case à cocher correspondant au langage que tu utilise => ton code te sera en partie fournit ;)

naga
1
CS-Tual Messages postés 15 Date d'inscription mercredi 25 mai 2011 Statut Membre Dernière intervention 20 mai 2016
8 nov. 2013 à 10:18
Re,

Merci de ta réponse, ton pattern répond exactement à mon problème.

Sinon, j'ai moi aussi trouvé de mon coté un pattern qui répond aussi à mon problème.

Je poste le code de la solution avec les 2 patterns :

public static void main(String[] args)
{
String stringExpression = "Rule(maRegle1) + Rule(maRegle2) == Rule(maRegle3) + Rule(maRegle4)";

/*
* Les 2 patterns fonctionnent
*/

// String stringPattern = "(Rule\\()(\\w+)";
String stringPattern = "(Rule\\((.*?)\\))";

Pattern pattern = Pattern.compile(stringPattern);
Matcher matcher = pattern.matcher(stringExpression);

while (matcher.find())
{
System.out.println(matcher.group(2));
}
}
0
Rejoignez-nous