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.
regex
capture
regex-group
goggin13
fonte
fonte
Respostas:
Dependendo da implementação da expressão regular, você pode usar os chamados grupos de não captura com a sintaxe
(?:…)
: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)
forac
oubc
.fonte
a
ou de formab
alguma. Em outras palavras, para corresponderac
oubc
, mas apenas capturar ac
:(?:a|b)(c)
ac
ouab
, mas desejo a saídaab
se,ab
e somente 'c', a saída for 'ac'.Se sua implementação tiver, você pode usar parênteses que não sejam de captura:
fonte
Mesmo o rubular não obriga a usar parênteses e a precedência de
|
é baixa. Por exemplo, a | bc não corresponde a cccfonte
|
é porque você não tem que parens uso.(?:a|b)c
corresponde aac
oubc
(o comportamento desejado), enquantoa|bc
corresponde aa
oubc
.Se suas alternativas OR forem todas de caracteres únicos - você pode apenas usar o operador "conjunto de caracteres":
só vai corresponder a
ac
oubc
e é mais legível.fonte