Extraer el número adyacente a la cadenaHola, ¿alguien puede ayudarme a extraer números adyacentes a cadenas?
Tengo la columna 1 que se muestra a continuación y espero extraer números adyacentes a "HFA" (columna 2).
Probé el siguiente JSL, pero no pude obtener la columna 2 que esperaba
Num( Regex( :Columna 1, "(\d\d\d)HFA | HFA(\d\d\d)", "\1" ) )
| columna1 | columna2 |
| 400HFA isa300 | 400 |
| isa300HFA400 | 400 |
Gracias por considerar la pregunta.
Automatización y secuencias de comandosRe: Extraer número adyacente a StringDado el pequeño conjunto de ejemplos, la siguiente fórmula funciona:
Num( Regex( :column1, "(\d*)HFA(\d*)", "\1\2" ) )
Esta solución tendrá problemas si tiene instancias como "400HFA300".Devolverá 400300.
Re: Extraer número adyacente a StringHola Ngambels,
Muchas gracias por su ayuda. Resolvió el problema.
lo intenté
"(\d*)HFA(\d*)"
pero aparentemente me perdí (no sabía que puedo y debo usar tanto \1 como \2)
"\1\2"
Aprendí cosas nuevas de ti y a través de esta discusión.
¡Una vez más, muchas gracias!
Re: Extraer número adyacente a StringSi por alguna razón es necesario abordar el problema @ngambles mencionado, una forma bastante simple sería usar Regex Match en lugar de Regex
Names Default To Here(1);
a = "400HFA isa300";
b = "isa300 HFA400";
c = "400HFA300";
d = "400HF300";
rgx_pattern = "(\d*)(?:HFA)(\d*)";
show(Regex Match(a, rgx_pattern));
show(Regex Match(b, rgx_pattern));
show(Regex Match(c, rgx_pattern));
show(Regex Match(d, rgx_pattern));
Sin embargo, Regex Match requerirá algunas comprobaciones adicionales, ya que devuelve una lista de grupos capturados.
Re: Extraer número adyacente a StringGracias @AprioriFish3134 por señalar el problema original (no \2), y @ngambles para una buena solución.
Si necesita incluso más niveles de paréntesis anidados, o los paréntesis secuenciales de su ejemplo, simplemente cuente los paréntesis abiertos de izquierda a derecha para descubrir el número de referencia posterior. La referencia posterior para alternativas no utilizadas es una cadena vacía.
Regex( "abac", "(((a)|(b)|(c))(c))+", "1=\1 2=\2 3=\3 4=\4 5=\5 6=\6" )
"1=ac 2=a 3=a 4= 5= 6=c"
Una cosa que podría no ser obvia: la referencia posterior también se puede usar en el patrón. Esto podría ser útil para asegurarse de que las comillas o apóstrofes iniciales y finales se utilicen de forma coherente:
Write( Regex(
"before 'a \!"b\!" c' after", // before 'a "b" c' after
"(\!"|')(.*?)\1", // ("|')(.*?)\1
"\2"
) )
a B C
(El escape \!" pone una comilla dentro de las cadenas; el comentario muestra el texto de la cadena.) En este ejemplo, el grupo \1 puede coincidir con " o ' y \2 coincide con todo el texto hasta otra aparición de \1.
¡Usa algunos comentarios si escribes expresiones regulares como esa! El próximo mantenedor lo apreciará.
Re: Extraer número adyacente a StringUn buen lugar para practicar y probar expresiones regulares es https://regex101.com/ .

Esos comentarios con los caracteres de escape JMP eliminados fueron muy útiles, tengo que comenzar a agregarlos cuando escribo patrones de expresiones regulares más complicados ( Problema de expresiones regulares con caracteres escapados )
Re: Extraer número adyacente a StringHola @Craige_Hales ,
Muchas gracias por enriquecer el debate.
De hecho, ¡la primera vez que aprendí sobre la expresión regular de JMP fue en su artículo anterior!
https://community.jmp.com/t5/Uncharted/Regex/ba-p/21008
Re: Extraer número adyacente a StringHOLA @jthi
Muchas gracias por su solución alternativa al problema y también por el enlace en regex.