Tengo cadenas de texto que pueden parecerse a Str1 y Str2 a continuación:
Str1 = "ParamList:Param1,Param2,Param3";
Str2 = "ParamList:Param1,Param2,Param3;Var2;Var3";
Entonces, hay una lista de valores delimitada por comas con el prefijo de una palabra clave y dos puntos. La lista delimitada por comas puede ir seguida o no de variables adicionales. Si es así, la lista delimitada por comas y las variables subsiguientes estarán separadas por punto y coma como se muestra en Str2.
Quiero tomar la lista delimitada por comas. Probé la siguiente expresión regular
ParamLst1 = RegexMatch(Str2, "(ParamList:)(.*);?")[3];
ParamLst2 = RegexMatch(Str2, "(ParamList:)(.*);?")[3];
Estoy pensando que encontrará "ParamList:" entonces (. *) Siendo codicioso hará coincidir todo con el final de la cadena, pero retrocederá hasta que encuentre cero o un punto y coma.
Debo estar pensando mal, ya que con Str2, obtengo todo de regreso al final de la cadena ("Param1, Param2, Param3; Var2; Var3")
Puedo usar la función de palabra para rescatarme:
word(1,ParamLst2 = RegexMatch(Str2, "(ParamList:)(.*)")[3],";");
y esto funciona tanto para Str1 como para Str2, pero agrega complejidad que estoy seguro que es innecesaria si pudiera comprender las expresiones regulares un poco mejor.
Algunas ideas ?
Aquí hay un enfoque de fuerza bruta simple que usa las funciones de cadena 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);
Salida:
plist1 = {"Param1", "Param2", "Param3"};
plist2 = {"Param1", "Param2", "Param3"};