¿Cuál es el problema con esta expresión regular cuando uso el indicador global y el distintivo entre mayúsculas y minúsculas? La consulta es una entrada generada por el usuario. El resultado debe ser [verdadero, verdadero].
var query = 'Foo B';
var re = new RegExp(query, 'gi');
var result = [];
result.push(re.test('Foo Bar'));
result.push(re.test('Foo Bar'));
// result will be [true, false]
var reg = /^a$/g;
for(i = 0; i++ < 10;)
console.log(reg.test("a"));
javascript
regex
acerca de
fuente
fuente

re.Respuestas:
El
RegExpobjeto realiza un seguimiento del lugarlastIndexdonde se produjo una coincidencia, por lo que en las coincidencias posteriores comenzará desde el último índice utilizado, en lugar de 0. Observe:Si no desea restablecer manualmente
lastIndexa 0 después de cada prueba, simplemente elimine lagbandera.Aquí está el algoritmo que dictan las especificaciones (sección 15.10.6.2):
fuente
lastIndexestá en los pasos 5, 6 y 11. Su declaración de apertura solo es cierta SI LA BANDERA GLOBAL ESTÁ CONFIGURADA.Está utilizando un solo
RegExpobjeto y ejecutándolo varias veces. En cada ejecución sucesiva continúa desde el último índice de coincidencia.Debe "restablecer" la expresión regular para comenzar desde el principio antes de cada ejecución:
Dicho esto, puede ser más legible crear un nuevo objeto RegExp cada vez (la sobrecarga es mínima ya que RegExp se almacena en caché de todos modos):
fuente
gbandera.RegExp.prototype.testactualiza lalastIndexpropiedad de las expresiones regulares para que cada prueba comience donde se detuvo la última. Sugeriría usarString.prototype.matchya que no actualiza lalastIndexpropiedad:Nota:
!!convierte en booleano y luego lo invierte para que refleje el resultado.Alternativamente, puede restablecer la
lastIndexpropiedad:fuente
Eliminar la
gbandera global solucionará su problema.Debiera ser
fuente
Usar la bandera / g le dice que continúe buscando después de un golpe.
Si la coincidencia tiene éxito, el método exec () devuelve una matriz y actualiza las propiedades del objeto de expresión regular.
Antes de tu primera búsqueda:
Después de la primera búsqueda
Elimine la g y sale de la búsqueda después de cada llamada a exec ().
fuente
exec.Debe establecer re.lastIndex = 0 porque con g flag regex realiza un seguimiento de la última coincidencia ocurrida, por lo que la prueba no irá a probar la misma cadena, para eso debe hacer re.lastIndex = 0
fuente
Tenía la función:
La primera llamada funciona. La segunda llamada no. La
sliceoperación se queja de un valor nulo. Supongo que esto se debe a lare.lastIndex. Esto es extraño porque esperaría un nuevoRegExpque se asigne cada vez que se llama a la función y no se comparte entre múltiples invocaciones de mi función.Cuando lo cambié a:
Entonces no obtengo el
lastIndexefecto remanente. Funciona como lo esperaría.fuente