Solución:
ECMAScript 2018 introduce grupos de captura con nombre en expresiones regulares de JavaScript.
Ejemplo:
const auth="Bearer AUTHORIZATION_TOKEN"
const { groups: { token } } = /Bearer (?<token>[^ $]*)/.exec(auth)
console.log(token) // "Prints AUTHORIZATION_TOKEN"
Si necesita admitir navegadores más antiguos, puede hacer todo con los grupos de captura normales (numerados) que puede hacer con los grupos de captura con nombre, solo necesita realizar un seguimiento de los números, lo que puede ser engorroso si el orden de captura del grupo en su cambios de expresiones regulares.
Solo puedo pensar en dos ventajas “estructurales” de los grupos de captura con nombre:
-
En algunos tipos de expresiones regulares (.NET y JGSoft, hasta donde yo sé), puede usar el mismo nombre para diferentes grupos en su expresión regular (vea aquí un ejemplo donde esto es importante). Pero la mayoría de los sabores de expresiones regulares no admiten esta funcionalidad de todos modos.
-
Si necesita hacer referencia a grupos de captura numerados en una situación en la que están rodeados de dígitos, puede surgir un problema. Digamos que desea agregar un cero a un dígito y, por lo tanto, desea reemplazar
(d)
con$10
. En JavaScript, esto funcionará (siempre que tenga menos de 10 grupos de captura en su expresión regular), pero Perl pensará que está buscando un número de referencia inversa.10
en lugar de numero1
, seguido de un0
. En Perl, puede usar${1}0
en este caso.
Aparte de eso, los grupos de captura con nombre son simplemente “azúcar sintáctico”. Ayuda usar grupos de captura solo cuando realmente los necesita y usar grupos que no capturan (?:...)
en todas las demás circunstancias.
El mayor problema (en mi opinión) con JavaScript es que no admite expresiones regulares detalladas, lo que facilitaría mucho la creación de expresiones regulares complejas y legibles.
La biblioteca XRegExp de Steve Levithan resuelve estos problemas.
Puede usar XRegExp, una implementación aumentada, extensible y entre navegadores de expresiones regulares, que incluye compatibilidad con sintaxis, indicadores y métodos adicionales:
- Agrega una nueva sintaxis de regex y texto de reemplazo, incluido un soporte completo para la captura con nombre.
- Agrega dos nuevas banderas de expresiones regulares:
s
, para hacer que el punto coincida con todos los caracteres (también conocido como modo dotall o singleline), yx
, para espacios libres y comentarios (también conocido como modo extendido). - Proporciona un conjunto de funciones y métodos que facilitan el procesamiento de expresiones regulares complejas.
- Corrige automáticamente las inconsistencias entre navegadores más comunes en el comportamiento y la sintaxis de las expresiones regulares.
- Le permite crear y usar fácilmente complementos que agregan nueva sintaxis y marcas al lenguaje de expresiones regulares de XRegExp.
Otra posible solución: cree un objeto que contenga los nombres de los grupos y los índices.
var regex = new RegExp("(.*) (.*)");
var regexGroups = { FirstName: 1, LastName: 2 };
Luego, use las claves de objeto para hacer referencia a los grupos:
var m = regex.exec("John Smith");
var f = m[regexGroups.FirstName];
Esto mejora la legibilidad / calidad del código utilizando los resultados de la expresión regular, pero no la legibilidad de la expresión regular en sí.