Para explicarme lo haré con un ejemplo más sencillo.
El problema es que estás machacando los grupos de captura con búsquedas posteriores.
Por ejemplo, considera la siguiente entrada 5-4-2
y la expresión regular: (\d)(?:(-)(\d))+
que solo buscaría números y signo de restar (pero que funciona de la misma manera que tu expresión)
- El primer grupo es el primer número
- El segundo grupo es la operación (para simplificar, siempre resta)
- El tercer grupo es el siguiente número
El problema es que con esta expresión: (?:(-)(\d))+
capturas -4
, pero como se puede repetir por el +
, luego capturas -2
y machacas los valores que tenías
en el segundo y tercer grupo de captura. Siempre te quedas con lo último.
Así pues, después de ejecutarlo, el primer grupo tendría 5
, el segundo -
y el tercero 2
Ejemplo
Una posible alternativa sería capturar el conjunto completo de operaciones y luego ir realizando búsquedas con un bucle. Por ejemplo, para el ejemplo simplificado:
Buscaríamos: (\d)((?:-\d)+)
Ahora el segundo grupo tiene -4-2
, que guardaremos en una variable. Ahora realizaremos una nueva búsqueda en esa nueva variable por (-)(\d)
(con flag global g
) y para cada iteración guardaremos el grupo 1 y 2 en alguna variable (como un array)
Aquí tienes todo el proceso (simplificado) con javascript:
let match = '5-4-2'.match(/(\d)((?:-\d)+)/);
let primero = match[1];
let segundo = match[2];
console.log('La segunda parte es: ' + segundo + ', Vamos a procesarla');
let operaciones = [];
let index_operaciones = 0;
const regexsegundo = /(-)(\d)/g;
while ((m = regexsegundo.exec(segundo)) !== null) {
// Para evitar bucles infinitos con búsquedas de longitud 0
// Si no es tu caso, puedes quitar este IF
if (m.index === regexsegundo.lastIndex) {
regexsegundo.lastIndex++;
}
operaciones[index_operaciones] = [];
operaciones[index_operaciones][0] = m[1];
operaciones[index_operaciones][1] = m[2];
index_operaciones++
}
console.log('Resultados_________________');
console.log('Primero = ' + primero);
console.log('Luego = ');
console.log(operaciones);