¿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
RegExp
objeto realiza un seguimiento del lugarlastIndex
donde 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
lastIndex
a 0 después de cada prueba, simplemente elimine lag
bandera.Aquí está el algoritmo que dictan las especificaciones (sección 15.10.6.2):
fuente
lastIndex
está 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
RegExp
objeto 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
g
bandera.RegExp.prototype.test
actualiza lalastIndex
propiedad de las expresiones regulares para que cada prueba comience donde se detuvo la última. Sugeriría usarString.prototype.match
ya que no actualiza lalastIndex
propiedad:Nota:
!!
convierte en booleano y luego lo invierte para que refleje el resultado.Alternativamente, puede restablecer la
lastIndex
propiedad:fuente
Eliminar la
g
bandera 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
slice
operación se queja de un valor nulo. Supongo que esto se debe a lare.lastIndex
. Esto es extraño porque esperaría un nuevoRegExp
que 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
lastIndex
efecto remanente. Funciona como lo esperaría.fuente