Problema de expresiones regulares con caracteres escapadosTengo un problema con las expresiones regulares y los caracteres entre paréntesis.
Este fragmento de JSL:
Show(Regex("abcdef[ghi]", "([^\[]*)\[([^\]]*)\]", "\1{\2}"))no funciona en JMP (14.1). Da el siguiente error:
Unexpected "([^]*)\[([^\]]*)\]", "\1{\2}"))". Perhaps there is a missing "," or ")".
Trying to parse arguments of function "Regex".Sin embargo, esta es una expresión regular válida en mi probador de expresiones regulares de Perl. (Uso Patterns en OS X.) En ese entorno, ingresando:
abcdef[ghi]
a la expresión regular
([^\[]*)\[([^\]]*)\]
usando el valor de reemplazo de
$1{$2}da el resultado
abcdef{ghi}(La expresión de Perl es
$searchText =~ s/([^\[]*)\[([^\]]*)\]/$1{$2}/gism;).
¿Qué está pasando? ¿El motor de expresiones regulares de JMP necesita alguna otra forma de escapar de los caracteres entre paréntesis?
Gracias.
Re: Problema Regex con caracteres escapadosTampoco funciona:
c=Regex("abcdef{:[[ghi]]:[{op},{q}]}", ":\[\[]\!007B([^\]]*)\]", "[{\1]");
Re: Problema Regex con caracteres escapadosCometí un error. Escribir código como este no te da el resultado correcto.
c=Regex("abcdef{:[[ghi]]:[{op},{q}]}", ":\[\[]\([^\]]*)\]", "[\1]");
Re: Problema Regex con caracteres escapadosCómo lidiar con esta combinación: El rango de reservas es desde ":[{" inicio、 hasta el final "]".
{:[[ghi]]:[{op},{q}]}abcdefNecesito obtener:
[{op},{q}]
Re: Problema Regex con caracteres escapadosComo seguimiento, aprendí algo que no sabía sobre Perl regex, y es que el motor es lo suficientemente inteligente como para saber que "[^[]" significa "todo menos "[". Es decir, el motor es lo suficientemente inteligente como para no insistir en una barra invertida antes del segundo "[" en este contexto particular. También sabe cómo interpretar "[^abc[]" correctamente.
Parece que el motor de JMP también entiende esto.
Así que me estaba causando más problemas de los que necesitaba al escapar del "[".
Re: Problema Regex con caracteres escapados¡Ajá! Gracias a ambos pmroz y Mark. Con un poco de manipulación, descubrí cómo hacer lo que quiero.
1. Para el beneficio del intérprete de JSL, primero escape toda la cadena de expresiones regulares usando \[…]\.
2. Luego, para el beneficio del motor Regex, escape los caracteres de paréntesis como lo haría en Perl.
El resultado es:
Show(Regex("abcdef[ghi]", "\[([^\[]*)\[([^\]]*)\]]\", "\1{\2}"));que arroja el resultado esperado de;
abcdef{ghi}Descomponiendo la cadena tenemos:
1. \[ para JSL
2. [([^\[]*)\[([^\]]*)\] para el motor Regex (al igual que en Perl)
3. ]\ para JSL
¡¡¡Uf!!!
Re: Problema Regex con caracteres escapadosEl carácter de barra invertida se usa para escapar del siguiente carácter, en general, al igual que el tipo de Perl, pero también denota conjuntos de caracteres especiales como \s para caracteres de espacio o \d para dígitos. No tendrías éxito si quisieras entrar s por entrar \s en la expresión regular. La secuencia de escape \[ es especial y va maridado con el cierre ]\ secuencia. Es decir, no es la forma de incluir el literal ] personaje. En su lugar, incluirá la cadena hasta la secuencia de escape de cierre.
Vea este ejemplo en forma explosionada (cuatro grupos de captura) que ilustra cómo funcionan:
Regex(
"abcdef[ghi]",
"([^\[\[]\]*)" || "(\[\[]\)" || "([^\[\[]\]*)" || "(\[\]]\)",
"\1-\2-\3-\4"
);
Re: Problema Regex con caracteres escapados@pmroz es correcto. JMP tomó una decisión desafortunada, mucho antes de que se agregara la compatibilidad con expresiones regulares, para permitir que \[ ... ]\ en cualquier lugar de una cadena signifique ignorar todos los significados de caracteres especiales intermedios. Para obtener el texto literal \[ se requiere usar el otro mecanismo de escape de JMP \!X, reemplazando X con \ , para representar un \ que no se combina con [ cuando JMP está analizando el JSL. Más tarde, cuando regex analiza el patrón, el \ es seguido por el [ que a su vez le dice a regex que ignore el significado especial de [ y lo trate como un carácter simple.
Estoy pensando en cómo hacer esto más fácil, ¡gracias por el informe!
Re: Problema Regex con caracteres escapadospensamiento interesante En Perl \ se escapa solo el siguiente carácter.
Pero si esto es diferente en JMP, entonces esto debería funcionar:
Mostrar (regex ("abcdef [ghi]", "([^\[\]*)\[\([^\]\].*)\]\", "\1{\2}"))
Desafortunadamente, no:
Regex: esperando ')' en la posición 21 en el patrón '([^\]*)\[\([^\].*)\]\'. en el acceso o evaluación de 'Regex' , Regex/*###*/("abcdef[ghi]", "([^\]*)\!\[\([^\].*)\]\", "\1{\2}")
Re: Problema Regex con caracteres escapadosEsto hará lo que quieras.¡Tuve que escapar de las dos secuencias de escape!
Show(Regex("abcdef[ghi]", "([^\[\[]\]*)\[\[]\([^\]]*)\]", "\1{\2}"));
Regex("abcdef[ghi]", "([^\!\[]*)\!\[([^\]]*)\]", "\1{\2}") = "abcdef{ghi}";Re: Problema Regex con caracteres escapadosMe pregunto si es porque tiene la secuencia de caracteres de escape de cadena "\[" en su cadena.Esa secuencia significa tratar todo después como una cadena hasta que presiones "]\".
"([^ \[ ]*) \[ ([^\]]*) \] "
Re: Problema Regex con caracteres escapadosPD Extrañamente, esto funciona bien en JMP:
Show(Regex("abcdef(ghi)", "([^(]*)\(([^\)]*)\)", "\1[\2]"))dando el resultado correcto:
Regex("abcdef(ghi)", "([^(]*)\(([^\)]*)\)", "\1[\2]") = "abcdef[ghi]";Re: Problema Regex con caracteres escapados