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é?
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: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.