JSL REGEX palabra límites \ b<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hola, -
¿Soporta JSL los límites de palabras REGEX? \ b?
Estoy tratando de reemplazar palabras completas en el texto usando PAT MATCH y la expresión "\ bword \ b". Por alguna razón, JSL no procesa \ b, aunque reconoce y procesa \ W. Desafortunadamente, W no es lo suficientemente bueno para mi tarea, ya que no coincide con las entradas de una sola palabra, entre otras cuestiones que introduce.
Ejemplo:
a = "la ventana es: abierta";
p = pat regex ("\ bis \ b");
coincidencia pat (a, p, "era");
Espero que vuelva a = "la ventana era: abierta";
¡Gracias! - Shaul
Re: JSL REGEX palabra fronteras \ bAh, muy bien. Mucho mejor gracias. JMP10 tiene una función de expresiones regulares simplificada que reemplaza globalmente:
expresiones regulares ("hola", "[^ aeiou]", "?", GLOBALREPLACE);
"? e ?? o"
RegexMatch () requiere un bucle externo (while () del ejemplo anterior). PatMatch () puede usar una expresión regular como parte de un patrón pero no usa las referencias anteriores excepto dentro de un patRegex (); patMatch está diseñado para crear un patrón utilizando las funciones patXXXX en lugar del lenguaje de expresiones regulares y tiene diferentes formas de capturar coincidencias parciales.
Re: JSL REGEX palabra fronteras \ bSimplifiqué el Regex usando \ W (JMP9 aceptado \ W):
x = "el zorro grande, muy rápido";
a = Concord Regex (x, "(\ W | ^) (muy) (\ W | $)", "\ 1fairly \ 3");
imprimir (x);
Mi único problema pendiente es que solo se reemplaza una vez, así que necesito un bucle hasta que no se devuelvan más coincidencias. ¿Hay una bandera, como FULLSCAN, que pueda especificar en Regex Match? No pude hacer funcionar a Pat Match por alguna razón.
En cualquier caso, ¡ya me has ayudado mucho!
Re: JSL REGEX palabra fronteras \ bLas expresiones entre paréntesis en la expresión regular forman un grupo de captura al que se puede hacer referencia por número; cuente solo los parens abiertos, de izquierda a derecha, para obtener el número. El texto que coincide con el grupo de captura se puede utilizar como una referencia posterior más adelante en la expresión regular o en la cadena de reemplazo. \ 1 es una referencia posterior al primer grupo de captura.
regexMatch (x, "([^ a-zA-Z0-9_] | ^) ([a-zA-Z0-9 _] {4}) ([^ a-zA-Z0-9_] | $)", " \ 1fairly \ 3 ");
tiene 3 parens abiertos; el conjunto intermedio (alrededor de la palabra que coincide) no era realmente necesario, pero como están allí, uso \ 1 y \ 3 en la cadena de reemplazo. \ 0 se refiere a todo el partido. Si anida los grupos de paréntesis, todavía cuenta los parens abiertos, de izquierda a derecha, para obtener el número.
Utilicé {4} repeticiones para hacer un ejemplo que no encontrara las palabras de tres y cinco letras en el texto de origen que vino primero. Es posible que necesite alguna otra manera de especificar la palabra. Aquí hay un ejemplo que mastica las palabras de una en una:
Imprimir (Versión JMP ());
x = "el zorro grande, muy rápido";
Mientras (1,
resultados = Regex Match (x, "([^ a-zA-Z0-9_] | ^) ([a-zA-Z0-9 _] +) ([^ a-zA-Z0-9_] | $)", "\ 1 \ 3");
Si (N Artículos (resultados)> = 3,
Imprimir (resultados [3]),
Descanso()
);
);
"9.0.2"
"la"
"grande"
"muy"
"rápido"
"zorro"
En este ejemplo, el + significa "una o más de las expresiones anteriores", por lo que es posible que no necesite la longitud explícita. RegexMatch devuelve una lista de referencias anteriores; el primer elemento de la lista es \ 0, que representa la coincidencia completa. results [3] is \ 2, que es la palabra que coincidió. El reemplazo es \ 1 \ 3, que corta \ 2 de la cadena.
Hay una serie de sitios web que tienen tutoriales para expresiones regulares. Regular-Expressions.info - Regex Tutorial, ejemplos y referencia - Regexp patrones , por ejemplo.
JMP11's \ b simplificará los ejemplos, mucho.
Re: JSL REGEX palabra fronteras \ bEsto es muy útil ya que todavía estoy en JMP9.
Tendré que ajustar dinámicamente el {n} en función de la longitud de la cadena para que coincida.
¿Puedes explicar cómo funciona la numeración de las sustituciones? No estoy seguro de entender lo que hacen \ 1 y \ 3?
¡Gracias! - Shaul
Re: JSL REGEX palabra fronteras \ bJMP10 no admite el límite de palabra \ b en expresiones regulares. JMP11 lo hará. En los siguientes ejemplos, {4} significa 4 apariciones del carácter anterior que está destinado a coincidir con la palabra "muy" de 4 letras al requerir el límite de palabra a cada lado. La función regexMatch interpreta el segundo argumento como una expresión regular e interpreta el tercer argumento como texto de reemplazo con sustituciones numeradas después de los grupos de paréntesis de captura (utilizados en el segundo ejemplo).
imprimir (JMPVERSION ());
x = "el zorro grande, muy rápido";
regexMatch (x, "\ b \ w {4} \ b", "bastante");
imprimir (x);
"11.0.0"
"El zorro grande, bastante rápido"
JMP10 podría hacerlo bastante bien, dependiendo de sus necesidades, capturando los caracteres delimitadores e insertándolos nuevamente en el reemplazo:
imprimir (JMPVERSION ());
x = "el zorro grande, muy rápido";
regexMatch (x, "([^ a-zA-Z0-9_] | ^) ([a-zA-Z0-9 _] {4}) ([^ a-zA-Z0-9_] | $)", " \ 1fairly \ 3 ");
imprimir (x);
"10.0.1"
"El zorro grande, bastante rápido"
\ b es un patrón difícil de hacer imposible de escribir porque debe coincidir antes y después de una palabra y, sin embargo, no coincide con ningún texto y la palabra puede estar al principio (^) o al final ($) de el texto. El segundo ejemplo se basa en el requisito de "no coincidir con ningún texto en absoluto" utilizando los grupos de paréntesis \ 1 y \ 3 en el texto de reemplazo.