Posso usar um OR em regex sem capturar o que está incluído?

115

Estou usando rubular.com para construir meu regex e sua documentação descreve o seguinte:

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

Como posso usar uma expressão OR sem capturar o que está nela? Por exemplo, digamos que eu queira capturar "ac" ou "bc". Eu não posso usar o regex

(a|b)(c)

certo? Desde então, capturo "a" ou "b" em um grupo e "c" em outro, não o mesmo. Eu sei que posso filtrar os resultados capturados, mas isso parece mais trabalhoso ...

Estou perdendo algo óbvio? Estou usando isso em Java, se for pertinente.

goggin13
fonte
Belo +1 para o link para o rubular
bukowski

Respostas:

181

Dependendo da implementação da expressão regular, você pode usar os chamados grupos de não captura com a sintaxe (?:…):

((?:a|b)c)

Aqui (?:a|b)está um grupo, mas você não pode fazer referência a sua correspondência. Portanto, você só pode fazer referência se a correspondência ((?:a|b)c)for acou bc.

quiabo
fonte
isso fez isso! Obrigado pela resposta super rápida. Aceitarei após o prazo (que eu não sabia que existia) expirar.
goggin13
4
Achei que a ideia não era capturar o aou de forma balguma. Em outras palavras, para corresponder ac ou bc, mas apenas capturar a c:(?:a|b)(c)
Alan Moore
1
@AlanMoore É possível capturar um e não o outro na declaração ou? Portanto, estou procurando o padrão acou ab, mas desejo a saída abse, abe somente 'c', a saída for 'ac'.
Moondra de
24

Se sua implementação tiver, você pode usar parênteses que não sejam de captura:

(?:a|b)
Marc Mutz - mmutz
fonte
@mmutz Obrigado pela resposta rápida! Eu gostaria de poder aceitar as duas respostas, era exatamente isso que eu estava procurando
goggin13
3

Mesmo o rubular não obriga a usar parênteses e a precedência de |é baixa. Por exemplo, a | bc não corresponde a ccc

msw
fonte
o que o operador '! ~' faz? Gosto da sua expressão, com menos parênteses, regex já é bagunçado o suficiente
goggin13
! ~ é um perlismo para "não corresponde", foi uma escrita desleixada da minha parte; consertado, obrigado.
msw
2
Eu não entendo você. A baixa precedência |é porque você não tem que parens uso. (?:a|b)ccorresponde a acou bc(o comportamento desejado), enquanto a|bccorresponde a aou bc.
Alan Moore
2

Se suas alternativas OR forem todas de caracteres únicos - você pode apenas usar o operador "conjunto de caracteres":

([ab]c)

só vai corresponder a acou bce é mais legível.

yrtimiD
fonte