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.
regex
capture
regex-group
goggin13
fuente
fuente
Respuestas:
Dependiendo de la implementación de la expresión regular, puede usar los llamados grupos que no capturan con la sintaxis
(?:…)
: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 seaac
obc
.fuente
a
nib
nada. En otras palabras, para igualarac
obc
, pero solo capturar elc
:(?:a|b)(c)
ac
oab
, pero quiero generarab
siab
y solo 'c' es la salida es 'ac'.Si su implementación lo tiene, entonces puede usar paréntesis sin captura:
fuente
Incluso rubular no te obliga a usar paréntesis y la precedencia de
|
es baja. Por ejemplo, a | bc no coincide con cccfuente
|
eso usted no tiene que parens uso.(?:a|b)c
coincide conac
obc
(el comportamiento deseado), mientras quea|bc
coincide cona
obc
.Si sus alternativas OR son todas caracteres individuales, puede usar el operador "conjunto de caracteres":
solo coincidirá con
ac
obc
y es más legible.fuente