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.


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.


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)

@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


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.