J'ai des chaînes de texte qui peuvent ressembler à Str1 et Str2 ci-dessous :
Str1 = "ParamList:Param1,Param2,Param3";
Str2 = "ParamList:Param1,Param2,Param3;Var2;Var3";
Il existe donc une liste de valeurs délimitées par des virgules préfixées par un mot-clé et deux points. La liste délimitée par des virgules peut être suivie ou non de variables supplémentaires. Si tel est le cas, la liste délimitée par des virgules et les variables suivantes seront séparées par des points-virgules comme indiqué dans Str2.
Je veux récupérer la liste délimitée par des virgules. J'ai essayé l'expression régulière suivante
ParamLst1 = RegexMatch(Str2, "(ParamList:)(.*);?")[3];
ParamLst2 = RegexMatch(Str2, "(ParamList:)(.*);?")[3];
Je pense qu'il trouvera "ParamList:", puis (.*) étant gourmand, il fera correspondre tout jusqu'à la fin de la chaîne, mais sauvegardera jusqu'à ce qu'il trouve zéro ou un point-virgule.
Je dois mal y penser, puisqu'avec Str2, je ramène tout à la fin de la chaîne ("Param1,Param2,Param3;Var2;Var3")
Je peux utiliser le mot fonction pour me renflouer :
word(1,ParamLst2 = RegexMatch(Str2, "(ParamList:)(.*)")[3],";");
et cela fonctionne à la fois pour Str1 et Str2, mais ajoute une complexité qui, j'en suis sûr, est inutile si je pouvais comprendre un peu mieux l'expression régulière !
Des idées ?
Ou, en utilisant regex
Str1 = "ParamList:Param1,Param2,Param3";
Str2 = "ParamList:Param1,Param2,Param3;Var2;Var3";
regex(Str2, "^([^:]*):([^;]*);?(.*)$", "part1='\1' part2='\2' part3='\3'" )
</CODE></P><P><STRONG>part1='ParamList' part2='Param1,Param2,Param3' part3=''</STRONG></P><P><STRONG>ou</STRONG></P><P><STRONG>part1='ParamList' part2='Param1,Param2,Param3' part3='Var2;Var3'</STRONG></P><P>Le début ^ et la fin $ forcent l'expression régulière à correspondre du début à la fin. Le [^:] correspond aux caractères qui ne le sont pas : et [^;] correspond aux caractères qui ne le sont pas ; . Le solitaire : dépasse le requis : et le ;? est un facultatif ; .Le .* correspond aux caractères restants, le cas échéant.</P><P>Les parents forment des groupes de capture. Les groupes sont appelés dans le 3ème paramètre \1, \2 et \3 et insérés dans une chaîne qui donne le résultat.</P><P>Notez que tous les opérateurs * sont écrits de manière à ne jamais aller « trop loin » et à devoir sauvegarder. Cela rend la correspondance efficace. Utilisez les classes de caractères négatives lorsque vous le pouvez pour tout faire correspondre jusqu'à un délimiteur.</P><P>La chaîne de résultat pourrait être "\2" si c'est tout ce que vous voulez.</P><P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-335077" slang="en-US" mode="NONE">Re : Regex recherche des caractères facultatifs</LINGO-SUB><LINGO-BODY id="lingo-body-335077" slang="en-US" mode="NONE"><P>Voici une approche simple par force brute utilisant les fonctions de chaîne de JSL.</P>
<PRE><CODE class=" language-jsl">Str1 = "ParamList:Param1,Param2,Param3";
Str2 = "ParamList:Param1,Param2,Param3;Var2;Var3";
s1 = substr(str1, 11);
w1 = words(s1, ";");
plist1 = words(w1[1], ",");
s2 = substr(str2, 11);
w2 = words(s2, ";");
plist2 = words(w2[1], ",");<BR />show(plist1, plist2);
Sortir:
plist1 = {"Param1", "Param2", "Param3"};
plist2 = {"Param1", "Param2", "Param3"};