¿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.


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.


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)

@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


¿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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.