Regular Expressions Grupos de captura con nombre


Ejemplo

Algunos sabores de expresiones regulares permiten grupos de captura con nombre . En lugar de hacerlo mediante un índice numérico, puede referirse a estos grupos por su nombre en el código posterior, es decir, en las referencias inversas, en el patrón de reemplazo y en las siguientes líneas del programa.

Los índices numéricos cambian a medida que cambia el número o la disposición de los grupos en una expresión, por lo que son más frágiles en comparación.

Por ejemplo, para hacer coincidir una palabra ( \w+ ) entre comillas simples o dobles ( ['"] ), podríamos usar:

(?<quote>['"])\w+\k{quote}

Lo que equivale a:

(['"])\w+\1

En una situación simple como esta, un grupo de captura numerado y regular no tiene ningún inconveniente.

En situaciones más complejas, el uso de grupos con nombre hará que la estructura de la expresión sea más evidente para el lector, lo que mejora la capacidad de mantenimiento.

El análisis de archivos de registro es un ejemplo de una situación más compleja que se beneficia de los nombres de grupo. Este es el formato de registro común de Apache (CLF):

127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326

La siguiente expresión captura las partes en grupos nombrados:

(?<ip>\S+) (?<logname>\S+) (?<user>\S+) (?<time>\[[^]]+\]) (?<request>"[^"]+") (?<status>\S+) (?<bytes>\S+)

La sintaxis depende del sabor, los más comunes son:

  • (?<name>...)
  • (?'name'...)
  • (?P<name>...)

Backreferences:

  • \k<name>
  • \k{name}
  • \k'name'
  • \g{name}
  • (?P=name)

En la versión .NET, puede tener varios grupos compartiendo el mismo nombre, usarán pilas de captura .

En PCRE, debe habilitarlo explícitamente utilizando el modificador (?J) ( PCRE_DUPNAMES ), o utilizando el grupo de restablecimiento de rama (?|) . Sin embargo, solo el último valor capturado será accesible.

(?J)(?<a>...)(?<a>...)
(?|(?<a>...)|(?<a>...))