Regex recherche de caractères facultatifsJ'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écédées d'un mot-clé et de deux points. La liste délimitée par des virgules peut ou non être suivie 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 saisir 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 correspondra tout à la fin de la chaîne, mais sauvegardera jusqu'à ce qu'il trouve zéro ou un point-virgule.
Je dois y penser mal, car 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 de la complexité qui, j'en suis sûr, n'est pas nécessaire si je pouvais comprendre un peu mieux l'expression régulière!
Des idées ?
ScriptingRe: Regex recherche de caractères facultatifsVoici une approche simple de la force brute utilisant les fonctions de chaîne de 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);
Production:
plist1 = {"Param1", "Param2", "Param3"};
plist2 = {"Param1", "Param2", "Param3"};Re: Regex recherche de caractères facultatifsOu, en utilisant regex
Str1 = "ParamList:Param1,Param2,Param3";
Str2 = "ParamList:Param1,Param2,Param3;Var2;Var3";
regex(Str2, "^([^:]*):([^;]*);?(.*)$", "part1='\1' part2='\2' part3='\3'" )
part1 = 'ParamList' part2 = 'Param1, Param2, Param3' part3 = ''
ou
part1 = 'ParamList' part2 = 'Param1, Param2, Param3' part3 = 'Var2; Var3'
Le début ^ et la fin $ forcent l'expression régulière à correspondre du début à la fin. [^:] Correspond aux caractères qui ne sont pas: et [^;] correspond aux caractères qui ne le sont pas; . Le seul: dépasse les exigences: et le;? est une option; .Le. * Correspond aux caractères restants, le cas échéant.
Les parents font des groupes de capture. Les groupes sont référencés dans le troisième paramètre comme \ 1, \ 2 et \ 3 et insérés dans une chaîne qui donne le résultat.
Notez que tous les opérateurs * sont écrits pour ne jamais aller "trop loin" et avoir besoin de sauvegarder. Cela rend la correspondance efficace. Utilisez les classes de caractères négatifs lorsque vous le pouvez pour tout faire correspondre jusqu'à un délimiteur.
La chaîne de résultat pourrait être "\ 2" si c'est tout ce que vous voulez.