usando expresiones regulares para encontrar corchetesTengo un cliente que quiere extraer los números para los límites de especificaciones. Puede hacerlo cuando el texto usa paréntesis pero no para corchetes.Dado que los corchetes, "[" y "]", son caracteres especiales de expresiones regulares, pensé que usar el carácter de escape "\" o "\\" ayudaría, pero no pude hacerlo funcionar.
El texto que está buscando podría verse como [0.080, 1.20] y quiere usar expresiones regulares para obtener 0.080 y 1.2.
Su fórmula actual para encontrar paréntesis izquierdos, "(" en el texto se ve así:
Regex( :Texto, "((?<=\().+(?=\,))" )
Para paréntesis correctos, ")", usa
Regex( :Texto, "((?<=\,).+(?=\)))" )
¿Cómo se pueden modificar estas fórmulas para encontrar "[" o "]"?
Después de obtener eso, también le gustaría poder encontrar "<", ">", "+", "-" y "+/-".
Cualquier ayuda sería apreciada.
¡Gracias!
Re: usar regex para encontrar corchetesEsto siempre me hace tropezar porque \[ es la secuencia de escape para demarcar una cadena. Si lo escapa primero, puede usarlo para indicar un metacarácter de expresión regular
Num( Regex( :String, "\!\[([0-9\.eE\+\-]+)", "\1" ) )
para el primer numero
Num( Regex( :String, "\!\[([0-9\.eE\+\-]+)\s*,([0-9\.eE\+\-]+)", "\2" ) )
para el segundo.
Re: usar regex para encontrar corchetesHola charlie,
¿Tienes una idea de cómo se ve el texto? Es posible que el cliente ni siquiera necesite expresiones regulares. En entornos donde este es el caso, el JSL resultante suele ser mucho más fácil de implementar y mantener.
Por ejemplo:
Names Default To Here(1);
text = "this is a bunch of text with some data in it between brackets [2.3, 4.5] like so.";
specTxt = word(2, text, "[]");
specLo = num(word(1, specTxt, ","));
specHi = num(word(2, specTxt, ","));
show(specLo, specHi);
Re: usar regex para encontrar corchetesPero, ¿por qué usar un martillo de tachuelas cuando un mazo de 16 libras produce un golpe mayor?
Re: Usar regex para encontrar corchetes¡Tiene! Tan verdadero.
Re: usar regex para encontrar corchetesEsta es una gran pregunta para que el usuario la publique en el Discusiones tablero para ver la velocidad y la calidad de las respuestas que obtendrán de la comunidad de usuarios de JMP más grande.
Personalmente, nunca aprendí Regex, así que confío en el Funciones de caracteres para la mayoría de la manipulación de cadenas. En particular, la función Word() funciona de maravilla para mí.
Si aprende solo una función del Editor de fórmulas, Word() es la única
Re: usar regex para encontrar corchetesEsta es una gran idea. También tendría curiosidad por ver con qué frecuencia la gente hace lo que hice, responder la pregunta directamente, en lugar de pensar en lo que el usuario está tratando de hacer, para encontrar una solución simple y más elegante. Siempre es mejor entender lo que el usuario necesita y no necesariamente lo que quiere.
Re: usar regex para encontrar corchetesAquí hay otro ejemplo de cómo se puede usar una expresión regular.
Names Default to Here( 1 );
// source
string = "My spec limits are [0.080,1.20] for this CQA.";
// method 1: successive calls to Regex()
lsl = Num( Regex( string, "(\d*\.?\d*),(\d*\.?\d*)", "\1" ) );
usl = Num( Regex( string, "(\d*\.?\d*),(\d*\.?\d*)", "\2" ) );
// method 2: one call to Regex Match, then convert items
limit = Regex Match( string, "(\d*\.?\d*),(\d*\.?\d*)", "\2" );
lsl = Num( limit[2] );
usl = Num( limit[3] );
Re: usar regex para encontrar corchetes¡Gracias Brady!Probé tu solución y funciona.Me gusta la sencillez.¿Hay alguna manera de tener una búsqueda de palabras para "[" o "("?Creo que se acerca más a lo que busca el cliente.
¡gracias de nuevo!
charlie
Re: usar regex para encontrar corchetes¡Gracias Don!Su solución funciona para corchetes.¿Hay alguna manera de hacer que busque "(" o "[" para que funcione en cualquier caso?
¡gracias!
charlie
Re: usar regex para encontrar corchetesMarca-
Tuve un pequeño problema para que su solución funcionara.He adjuntado una tabla de datos de muestra.¿Podrías echar un vistazo y decirme qué estoy haciendo mal?
gracias,
charlie
Re: usar regex para encontrar corchetesgracias jeffNo sé expresiones regulares en absoluto y también trato de usar las funciones de caracteres.Sin embargo, quería responder a la pregunta del cliente usando una técnica muy similar a la que él estaba haciendo para que pudiera aplicarla fácilmente.
Lo animé a publicarlo en la comunidad.Veremos que pasa.
¡gracias!
charlie
Re: usar regex para encontrar corchetesHola charlie,
La función word() tiene 3 argumentos, el último de los cuales, el conjunto delimitador, es opcional. Esta es una cadena entre comillas que contiene todos los delimitadores que desea considerar. Entonces, el usuario colocaría corchetes y paréntesis en esta cadena.
Para ver cómo word() divide una función, puede ser útil examinar lo que devuelve la función words(). Words() devuelve una lista de todos los fragmentos de texto, después de delimitarlos.
Por ejemplo:
palabra (2, "Hit the road jack") devuelve "the".
word(2, "Hit the road jack", "") devuelve "i", porque la cadena vacía se usa cuando desea dividir el texto en caracteres individuales.
palabra(1, "abc/def[ghi]klm", "[]()") devuelve "abc/def"... si miras palabras( "abc/def[ghi]klm", "[]()" ), obtendrás
{ "abc/def", "ghi", "klm" } como resultado.
Espero que esto ayude.
Salud,
Brady
Re: usar regex para encontrar corchetesSi realmente desea usar Regex, la siguiente cadena se puede usar para superior o inferior
"[\!\[|\(]([0-9\.eE\+\-]+)\s*,\s*([0-9\.eE\+\-]+)"
la única diferencia será el segundo argumento, "\1" para el inferior y "\2" para el superior. Para entender lo que está pasando, piensa en la expresión como dividida en cuatro partes.
[\!\[|\(]
[a|b] coincidirá con a o b, tanto los corchetes como los paréntesis son caracteres especiales, por lo que deben escaparse usando la barra invertida. Debido a que la secuencia \[ también es especial en JSL, eso necesita el ! para indicar que no es una secuencia especial.
([0-9\.eE\+\-]+)
Los paréntesis capturan la expresión contenida en él. Esto es a lo que se refiere \1. De nuevo, los corchetes se utilizan para designar un conjunto de caracteres. En este caso, es uno o más (debido al + al final) de un número, punto (carácter especial con escape), más (ídem), menos (ídem), E minúscula o mayúscula. Si hay algún carácter que olvidé que se puede usar para significar un número, póngalo aquí.
\s*,\s*
cero o más espacios, una coma, cero o más espacios
([0-9\.eE\+\-]+)
Misma expresión que la primera capturada. Es referencia por \2. Lo bueno es que, una vez que has llegado tan lejos, puedes parar. No es necesario capturar el corchete de cierre o el paréntesis (hasta donde yo sé). Podrías si quisieras.
Dicho todo esto, usaría la solución de Brady. Es más breve y más fácil de entender. Deberá agregar la coma en el conjunto de delimitadores, es decir,
"[(,])"
Re: usar regex para encontrar corchetesSu ejemplo anterior no incluía un espacio después de la coma. Aquí está el ejemplo de script corregido:
Names Default to Here( 1 );
// source 1
string = "My spec limits are [0.080, 1.20] for this CQA.";
// method 1: successive calls to Regex()
lsl = Num( Regex( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\1" ) );
usl = Num( Regex( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\2" ) );
Show( lsl, usl );
// method 2: one call to Regex Match, then convert items
limit = Regex Match( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\2" );
lsl = Num( limit[2] );
usl = Num( limit[3] );
Show( lsl, usl );
// source 2
string = "My spec limits are (0.080, 1.20) for this CQA.";
// method 1: successive calls to Regex()
lsl = Num( Regex( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\1" ) );
usl = Num( Regex( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\2" ) );
Show( lsl, usl );
// method 2: one call to Regex Match, then convert items
limit = Regex Match( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\2" );
lsl = Num( limit[2] );
usl = Num( limit[3] );
Show( lsl, usl );
Adjunto su tabla de datos con las fórmulas corregidas.
Re: usar regex para encontrar corchetesEste es un buen ejemplo de cómo Regex puede ser complicado de implementar, sin una buena comprensión de los datos subyacentes. La presencia/ausencia de un espacio marcaba la diferencia.
Ahora suponga que cualquier formato numérico legítimo tenía que ser compatible. En este caso, Regex se volvería más feo, porque tendrías que tener en cuenta la notación científica, los negativos, los puntos (o no), etc.
En tales casos, una combinación de funciones JSL y Regex puede hacer el trabajo más fácilmente que cualquiera de las dos por separado.
Por ejemplo, en el JSL a continuación:
1) Sustituir cambia corchetes y paréntesis a llaves (el operador de lista... importante en el punto 3)
2) Regex toma las llaves y lo que contienen, se supone que son un par de números legítimos en cualquier formato
3) Parse convierte la cadena devuelta por Regex en una expresión JSL que asigna el contenido de la lista a specLo y specHi.
txt = "My spec limits are [-4.087e-3, 1.20] for this CQA.";
{specLo, specHi} = Parse( Regex( Substitute( txt, "(", "{", "[", "{", ")", "}", "]", "}" ), "\\!{.*\\!}" ) );
-Brady
Re: usar regex para encontrar corchetes¡Gracias por tu ayuda!