¿Cómo se utilizan los grupos no capturadores, es decir, (?:)
, en las expresiones regulares y para qué sirven?
?:
se utiliza cuando se quiere agrupar una expresión, pero no se quiere guardar como una porción coincidente/capturada de la cadena.
Un ejemplo sería algo que coincida con una dirección IP:
/(?:\d{1,3}\.){3}\d{1,3}/
Tenga en cuenta que no me importa guardar los 3 primeros octetos, pero la agrupación (?:...)
me permite acortar la regex sin incurrir en la sobrecarga de capturar y almacenar una coincidencia.
Hace que el grupo no sea capturado, lo que significa que la subcadena coincidente con ese grupo no se incluirá en la lista de capturas. Un ejemplo en ruby para ilustrar la diferencia:
"abc".match(/(.)(.)./).captures #=> ["a","b"]
"abc".match(/(?:.)(.)./).captures #=> ["b"]
Los grupos que capturan se pueden utilizar más adelante en la regex para que coincidan O se pueden utilizar en la parte de sustitución de la regex. Hacer un grupo no capturador simplemente exime a ese grupo de ser utilizado por cualquiera de estas razones.
Los grupos que no capturan son excelentes si está tratando de capturar muchas cosas diferentes y hay algunos grupos que no quiere capturar.
Esa es prácticamente la razón de su existencia. Mientras aprendes sobre grupos, aprende sobre Grupos Atómicos, ¡hacen mucho! También hay grupos de búsqueda, pero son un poco más complejos y no se utilizan tanto.
Ejemplo de uso más adelante en la regex (backreference):
<([A-Z][A-Z0-9]*)\b[^>]*>.*?</\1>
[ Encuentra una etiqueta xml (sin soporte ns) ]
([A-Z][A-Z0-9]*)
es un grupo de captura (en este caso es el tagname)
Más adelante en la regex está \1
que significa que sólo coincidirá con el mismo texto que estaba en el primer grupo (el grupo ([A-Z][A-Z0-9]*)
) (en este caso está coincidiendo con la etiqueta final).