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.

capturando múltiples instancias de un patrón

Tengo una cadena de texto:

{valor1}+{valor2}-{valor3}*{valor...n}

Utilizando una expresión regular, quiero capturar cada uno de los valores entre corchetes, así como los operadores entre ellos, y no sé cuántos corchetes habrá.

Intenté:

/(\{.*\}).*([\+|\-|\*|\/])*/mgU

pero eso solo me está obteniendo los valores y no los operadores. ¿Dónde me equivoqué?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Tu expresión regular no está capturando los operadores porque el grupo de operadores [\+|\-|\*|\/] no está cuantificado, por lo que solo coincide con un operador (si hay alguno) después del último valor capturado. Para capturar todos los operadores y valores, necesitas utilizar una afirmación de búsqueda hacia adelante para verificar el siguiente operador (o el final de la cadena) sin consumirlo, y luego repetir el patrón según sea necesario:

    /(\{[^{}]*\})(?=[\/*+\-])([\/*+\-])?/g
    

    Explicación:
    (\{[^{}]*\}) captura el contenido entre corchetes {}. [^{}] significa cualquier carácter excepto { y }, por lo que [^{}]* coincide con cualquier número de caracteres que no sean corchetes.
    (?=[\/*+\-]) es una afirmación de búsqueda hacia adelante que verifica si el siguiente carácter es uno de los operadores */+-, sin consumirlo (porque está dentro de una afirmación de búsqueda hacia adelante).
    ([\/*+\-])? captura el operador, si hay alguno, después del valor capturado. El ? significa que es opcional, porque el último valor no tiene un operador después de él.
    /g al final permite que coincida globalmente, así obtienes todas las coincidencias en la cadena.

    Ten en cuenta que el orden de los patrones importa: primero captura el valor, luego busca el operador.

Comments are closed.