Ayuda con expresiones regulares -Hola, necesito ayuda para usar la función Regex.
La cuerda es como...
"Bien.2020.Opcional.(No)"
Requerido: "Fine_2020_Optional"
Probé un par de combinaciones, pero no pude obtener el resultado en una expresión regular. Estoy usando este tipo de Regex en mi secuencia de comandos de bucle.
Alguna ayuda ?
Gracias.
Re: Ayuda con expresiones regulares -Gracias. Esto es muy útilRe: Ayuda con expresiones regulares -@Craige_Hales Felicitaciones x 10^6
Gracias
Re: Ayuda con expresiones regulares -Hola @Byron_JMP !
Podría hacerlo así:
source = "(aaa).Fine.2020.Optional.(Not).more.(leave out).last.(bbb)";
//
// remove text between parens, change . to _
//
parts = {}; // accumulator list of the individual parts
ipart = 0; // index to the parts list
rc = Pat Match( // test the rc (below) to make sure the match worked
source,
patpos(0) // PatRepeat must start at the beginning.
+
Pat Repeat(
( "." | Pat Pos( 0 ) ) // advance past a required period, or begin of string
+ // followed by either...
(
( "(" + Pat Break( ")" ) + ")" )
// above: match open paren and stop on a close paren. Parens and everything
// between is rejected by not adding anything to the list of parts.
| // or
( ( Pat Break( "." ) | Pat Rem() ) >> parts[ipart += 1] )
// above: scan forward up to, but not including, a period, or if
// that doesn't work, to the end (remainder) of the string.
// ipart += 1 adds 1 before subscripting. It is OK to add an item
// to a list just beyond the end of the list. The >> operator stores
// the matched value on its left into the variable on its right.
)
)
+
patrpos(0) // PatRepeat must stop at the end.
);
// re-join the parts with the _ separator
result = if(rc,Concat Items( parts, "_" ),"problem with match");
show(result);resultado = "Fine_2020_Optional_more_last";
Es bastante largo y bastante opaco (tal vez no tan opaco como las expresiones regulares). Pero...
- Regex() está realmente dirigido a realizar múltiples reemplazos; GLOBALREPLACE se realiza de manera eficiente. Probablemente necesitarás una segunda expresión regular para eliminar ( texto ), utilizando también GLOBALREPLACE si puede haber más de uno.
- Word(), en el ejemplo de Jeff también es bueno si sabes cuantos conservar y donde aparece el (texto) . No hay nada mejor que él en cuanto a simplicidad, facilidad de mantenimiento y quizás también velocidad.
- PatMatch() brilla en otros lugares; en realidad es para extraer información o, como máximo, colocar una cadena en una sola ubicación (no existe GLOBALREPLACE). El ejemplo muestra a PatMatch() extrayendo información para hacer una lista de piezas y luego volviendo a ensamblar las piezas.
Por otro lado, esta es una excelente introducción sobre cómo utilizar la coincidencia de patrones para extraer información de una cadena. El beneficio real proviene de cadenas más largas que se pueden analizar en una sola coincidencia (como arriba, en una cadena corta) porque la coincidencia solo tiene una sobrecarga de inicio una vez. Al hacer que PatRepeat recorra la cuerda en una sola pasada y al no modificar la cuerda, la coincidencia puede ser bastante rápida.
Re: Ayuda con expresiones regulares -La coincidencia de patrones también podría ser una buena solución, pero sigo tropezando con la sintaxis. Si tan solo hubiera alguien cerca que hablara snbol con fluidez... @Craige_Hales
Re: Ayuda con expresiones regulares -No olvide las funciones JMP integradas para realizar manipulación de cadenas, como Sustituto() , Munger() y, mi favorito , Palabra() . La sintaxis de esos podría ser más fácil de manejar para algo como esto.
str="Fine.2020.Optional.(Not)";
show(substitute(str, ".", "_"));
show(word(1, str, ".") || "_" || word(2, str, ".") || "_" || word(3, str, "."));
show(concat items(words(str, ".")[1::3], "_"));
Registro:
Substitute(str, ".", "_") = "Fine_2020_Optional_(Not)";
Word(1, str, ".") || "_" || Word(2, str, ".") || "_" || Word(3, str, ".") = "Fine_2020_Optional";
Concat Items(Words(str, ".")[Index(1, 3)], "_") = "Fine_2020_Optional";
Re: Ayuda con expresiones regulares -Bien, fuera de línea recibí un par de comentarios sobre la solución muy breve.
A continuación le indicamos cómo llegar por su cuenta. Puede que sea una trampa, pero es muchísimo más fácil.
Hice una tabla con el ejemplo. Seleccionó la columna y utilizó la recodificación.
En Recode utilicé reemplazar cadena y activé las expresiones regulares.
En el cuadro de diálogo de recodificación, activé ambas opciones de secuencias de comandos (abajo a la derecha)
Luego guardó el script en la ventana del script, copió un poco y lo pegó aquí. (bueno, verifiqué que funcionó y luego lo pegué).
Muchas gracias a @ErnestPasour : )


Ah, y está ese pequeño uso de "\." en vez de "." solo. La barra invertida es un carácter de escape y evita reemplazar todo con "_". Ese es el único conocimiento de expresiones regulares necesario para que esto funcione.
Re: Ayuda con expresiones regulares -expresión regular ( "esto.es.jmp" , "\." , "_" , REEMPLAZO GLOBAL );
Re: Ayuda con expresiones regulares -Esto es realmente muy útil. Gracias.
Re: Ayuda con expresiones regulares -Este sitio web tiene excelente información general sobre Regex:
https://www.regular-expressions.info/quickstart.html
También hay una herramienta para generar una expresión regular basada en sus entradas y salidas esperadas:
http://regex.inginf.units.it/
Re: Ayuda con expresiones regulares -Gracias pablo,
Hay pocos más simples, pude hacerlo pero este fue el indicado. lo que me dio algunos problemas. La próxima vez, si encuentro algún problema, me comunicaré con usted con más detalles. ¿Tiene alguna referencia/enlace para compartir conmigo/nosotros en Regex con buenos ejemplos? Eso sería muy util.
Gracias de nuevo.Re: Ayuda con expresiones regulares -Probablemente sería útil si tuviéramos más ejemplos de entradas y salidas esperadas y de dónde se está quedando atascado. El JSL siguiente funciona para su caso particular, pero no estoy seguro de si es aplicable a todos sus datos en general.
Regex("Fine.2020.Optional.(Not)",
"(\w+?)\.(\d+?)\.(\w+?)\.\(\w+?\)",
"\1_\2_\3"
);