javascript - probar - grupo de captura en expresiones regulares
expresiones regulares online (3)
Estoy explorando la captura de grupos en Regex y me estoy confundiendo acerca de la falta de documentación al respecto. Por ejemplo, ¿alguien puede decirme la diferencia entre dos expresiones regulares:
/(?:madhur)?/
y
/(madhur)?/
Según mi,? en segundo sugiere hacer coincidir a madhur
cero o una vez en la cadena.
¿En qué se diferencia el primero del segundo?
Aquí está el ejemplo más obvio:
"madhur".replace(/(madhur)?/, "$1 ahuja"); // returns "madhur ahuja"
"madhur".replace(/(?:madhur)?/, "$1 ahuja"); // returns "$1 ahuja"
Las referencias se almacenan en orden, de modo que la primera coincidencia se pueda recuperar con $1
, la segunda con $2
, etc. Si captura una coincidencia (es decir, (...)
lugar de (?:...)
), puede usar estas , y si no lo haces, entonces no hay nada especial. Como otro ejemplo, considere lo siguiente:
/(mad)hur/.exec("madhur"); // returns an array ["madhur", "mad"]
/(?:mad)hur/.exec("madhur"); // returns an array ["madhur"]
El primero no almacenará el grupo de captura, por ejemplo, $1
estará vacío. El prefijo ?:
convierte en un grupo que no captura . Esto generalmente se hace para un mejor rendimiento y para despejar las referencias anteriores.
En el segundo ejemplo, los caracteres del grupo de captura se almacenarán en la referencia inversa $1
.
No afecta el emparejamiento en absoluto.
Le dice al motor regex
- no almacenar los contenidos del grupo para su uso (como $ 1, $ 2, ...) por el método
replace()
- no devolverlo en la matriz de retorno del método
exec()
y - no contarlo como una referencia inversa (/ 1, / 2, etc.)