Expressions regulieres (regex) [Résolu]

Signaler
Messages postés
15
Date d'inscription
mercredi 25 mai 2011
Statut
Membre
Dernière intervention
20 mai 2016
-
CS-Tual
Messages postés
15
Date d'inscription
mercredi 25 mai 2011
Statut
Membre
Dernière intervention
20 mai 2016
-
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

Messages postés
4265
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
29 août 2018
16
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
CS-Tual
Messages postés
15
Date d'inscription
mercredi 25 mai 2011
Statut
Membre
Dernière intervention
20 mai 2016

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));
}
}