es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Una expresión regular para analizar una cadena de texto regex.

Necesito parsear una expresión regular con una expresión regular. Tengo una cadena de regex:

[a-z]{1}[-][0-9]{4}[-][ab]

La expresión regular actual para parsear la cadena anterior que encontré y que casi funciona es:

/(?|\[(.*?)\]\{(.*?)\}|\[(.*?)\](.*?))/g

Para ver lo que hace, se puede ver en este ejemplo de regex101 aquí y el error aquí está en la “Coincidencia 2” y su “Grupo 1” (-][0-9, que debería ser solo -).

El objetivo es coincidir con todo lo que está dentro de corchetes cuadrados [] seguido de un número entre llaves {}. Si faltan los corchetes {} después de los corchetes [], debería rellenarse con null, y esto es lo que hace el grupo de reinicio de rama. Además, si solo hay corchetes cuadrados seguidos de corchetes cuadrados, se espera que funcione de la misma manera (coincida con lo que está dentro de los corchetes cuadrados [] y rellene “Grupo 2” con null).

El problema es que mi expresión regular no se detiene en el tercer [-] y lo encuentra hasta -][0-9 en lugar de coincidir solo con - y luego comenzar a parsear [0-9]{4}.

La coincidencia esperada debería ser:

[a-z]{1}
a-z
1

[-]

null

[0-9]{4}
0-9
4

[-]

null

[ab]
ab
null

La coincidencia actual es incorrecta y es la siguiente:

[a-z]{1}
a-z
1

[-][0-9]{4}
-][0-9
4

[-]

null

[ab]
ab
null

¿Qué me estoy perdiendo?

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema con la expresión regular actual es que utiliza un cuantificador perezoso .*? para coincidir con todo lo que está entre corchetes [...] y llaves {...}. Esto hace que la expresión regular coincida más allá de la primera aparición de la secuencia de caracteres [-].

    Para solucionar esto, podemos utilizar una clase de caracteres más específica en lugar del cuantificador perezoso .*?. Por ejemplo, podemos usar [^[\]] para coincidir con cualquier carácter que no sea un corchete, lo que asegura que la expresión regular se detenga antes de encontrar otro corchete.

    La expresión regular actualizada se vería así:

    /(?|\[(\w)\]?\{(\d+)\}|\[(\w)\]([^\[\]]*)|\[([^\[\]]+)\]\{(\d+)\}|\[([^\[\]]+)\]([^\[\]]*))/
    

    En esta expresión regular actualizada, hemos utilizado clases de caracteres como \w para coincidir con cualquier carácter alfanumérico y \d para coincidir con cualquier dígito. Además, hemos utilizado la clase de caracteres [^[\]] para coincidir con cualquier carácter que no sea un corchete.

    Con esta expresión regular actualizada, podemos obtener los resultados esperados según se menciona en la pregunta.

Comments are closed.