¿Puedo usar un OR en expresiones regulares sin capturar lo que se incluye?

115

Estoy usando rubular.com para construir mi expresión regular, y su documentación describe lo siguiente:

(...)   Capture everything enclosed
(a|b)   a or b

¿Cómo puedo usar una expresión OR sin capturar su contenido? Por ejemplo, digamos que quiero capturar "ac" o "bc". No puedo usar la expresión regular

(a|b)(c)

¿Derecha? Desde entonces capturo "a" o "b" en un grupo y "c" en otro, no es lo mismo. Sé que puedo filtrar los resultados capturados, pero eso parece más trabajo ...

¿Me estoy perdiendo algo obvio? Estoy usando esto en Java, si es pertinente.

goggin13
fuente
Bonito +1 para el enlace a rubular
bukowski

Respuestas:

181

Dependiendo de la implementación de la expresión regular, puede usar los llamados grupos que no capturan con la sintaxis (?:…):

((?:a|b)c)

Aquí (?:a|b)hay un grupo, pero no puede hacer referencia a su coincidencia. Por lo tanto, solo puede hacer referencia a la coincidencia de ((?:a|b)c)que sea aco bc.

Gumbo
fuente
eso lo hizo! Gracias por la respuesta super rápida. Lo aceptaré después de que expire el límite de tiempo (que no sabía que existía).
goggin13
4
Pensé que la idea no era capturar el ani bnada. En otras palabras, para igualar ac o bc, pero solo capturar el c:(?:a|b)(c)
Alan Moore
1
@AlanMoore ¿Es posible capturar uno y no el otro en la declaración o? Así que estoy buscando el patrón aco ab, pero quiero generar absi aby solo 'c' es la salida es 'ac'.
Moondra
24

Si su implementación lo tiene, entonces puede usar paréntesis sin captura:

(?:a|b)
Marc Mutz - mmutz
fuente
@mmutz ¡Gracias por la rápida respuesta! Desearía poder aceptar ambas respuestas, eso era justo lo que estaba buscando
goggin13
3

Incluso rubular no te obliga a usar paréntesis y la precedencia de |es baja. Por ejemplo, a | bc no coincide con ccc

msw
fuente
¿Qué hace el operador '! ~'? Me gusta tu expresión, con menos parens, la expresión regular ya es lo suficientemente desordenada
goggin13
! ~ es un perlismo para "no coincide", fue una escritura descuidada de mi parte; arreglado, gracias.
msw
2
No te entiendo. La baja prioridad de |eso usted no tiene que parens uso. (?:a|b)ccoincide con aco bc(el comportamiento deseado), mientras que a|bccoincide con ao bc.
Alan Moore
2

Si sus alternativas OR son todas caracteres individuales, puede usar el operador "conjunto de caracteres":

([ab]c)

solo coincidirá con aco bcy es más legible.

yrtimiD
fuente