Me he estado rascando la cabeza desde hace bastante tiempo. Estoy tratando de obtener el conjunto de números después de cierta cadena usando Regex. Estoy usando la búsqueda positiva hacia atrás, pero no es compatible con muchos navegadores. Entonces, ¿hay alguna manera de construir un patrón para esto sin usar lookbehind ?
De los siguientes ejemplos, solo quiero obtener los números después de la cadena Test , por lo que solo debería ser 12345 y 67891 . Esto es multilínea.
Cadena 1:
Test 12345Cadena 2:
Test 12345, 67891 Sample 0101, 0202Este es el patrón que usé para ambos ejemplos con lookbehind:
/(?<=Test )\d+|(?<=, )\d+/gmSi entiendo correctamente, desea hacer coincidir solo los números en la línea que comienza con "Prueba", y no en ninguna otra línea. Y puede tener uno o dos números separados por comas. Si desea hacer coincidir los números y usarlos para algo, use, por ejemplo:
str.match(/Test (\d+)(?:, (\d+))?/m);Coincide con la cadena "Prueba" seguida de un grupo de dígitos de captura, seguido opcionalmente de un grupo no seguidor que consta de una coma, un espacio y otro grupo de dígitos de captura.
Esto produce:
const str1 = "Test 12345"; const str2 = "Test 12345, 67891\nSample 0101, 0202"; str1.match(/Test (\d+)(?:, (\d+))?/m); // -> ['Test 12345', '12345', undefined, index: 0, input: 'Test 12345', groups: undefined]Esta es una matriz de 3 elementos: el primer elemento es la coincidencia completa, que no necesita en este caso. El resto de los elementos son uno o dos grupos de dígitos coincidentes. Esto significa que puede obtener su respuesta usando:
str1.match(/Test (\d+)(?:, (\d+))?/m).slice(1).filter(Boolean); // -> ['12345']Del mismo modo, para la cadena multilínea:
str2.match(/Test (\d+)(?:, (\d+))?/m).slice(1).filter(Boolean); // -> ['12345', '67891']También podría capturar primero las líneas que desea y luego sacar los números, e incluso podría tener más líneas y números coincidentes por línea:
"Test 12345, 234, 23, 45\nSample 2, 5, 4\nTest 12" .match(/^Test .+$/mg) .map(line => line.match(/\d+/g)) .flat(); // -> ['12345', '234', '23', '45', '12']