Regex buscando caracteres opcionalesTengo 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 ?
ScriptingRe: Regex buscando caracteres opcionalesAquí 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"};Re: Regex buscando caracteres opcionalesO, usando expresiones regulares
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 = ''
o
part1 = 'ParamList' part2 = 'Param1, Param2, Param3' part3 = 'Var2; Var3'
El inicio ^ y el final $ obligan a la expresión regular a coincidir de principio a fin. [^:] Coincide con caracteres que no son: y [^;] coincide con caracteres que no lo son; . El solitario: pasa lo requerido: y el;? es opcional; .El. * Coincide con los caracteres restantes, si los hay.
Los padres hacen grupos de captura. Los grupos se denominan en el tercer parámetro como \ 1, \ 2 y \ 3 y se insertan en una cadena que genera el resultado.
Tenga en cuenta que todos los operadores * están escritos para que nunca vayan "demasiado lejos" y necesiten realizar una copia de seguridad. Esto hace que la combinación sea eficiente. Utilice las clases de caracteres negativos cuando pueda para hacer coincidir todo hasta un delimitador.
La cadena de resultado podría ser "\ 2" si eso es todo lo que desea.