154 votes

Puis-je utiliser un OU dans une expression rationnelle sans capturer ce qui est inclus ?

J'utilise rubular.com pour construire ma regex, et leur documentation décrit ce qui suit :

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

Comment puis-je utiliser une expression OR sans capturer ce qu'elle contient ? Par exemple, supposons que je veuille capturer soit "ac", soit "bc". Je ne peux pas utiliser la regex

(a|b)(c)

n'est-ce pas ? Depuis lors, je capture soit "a" ou "b" dans un groupe et "c" dans un autre, mais pas les mêmes. Je sais que je peux filtrer les résultats capturés, mais cela semble plus compliqué...

Ai-je raté quelque chose d'évident ? Je l'utilise en Java, si c'est pertinent.

255voto

Gumbo Points 279147

En fonction de l'implémentation de l'expression régulière, vous pouvez utiliser ce que l'on appelle des les groupes non captifs avec la syntaxe (?:…) :

((?:a|b)c)

Ici (?:a|b) est un groupe mais vous ne pouvez pas faire référence à sa correspondance. Vous ne pouvez donc faire référence qu'à la correspondance de ((?:a|b)c) qui est soit ac o bc .

35voto

Marc Mutz - mmutz Points 10367

Si votre implémentation le permet, vous pouvez utiliser des parenthèses non capturantes :

(?:a|b)

8voto

yrtimiD Points 158

Si vos alternatives OR sont toutes des caractères simples, vous pouvez utiliser l'opérateur "jeu de caractères" :

([ab]c)

il ne correspondra qu'à ac o bc et c'est plus lisible.

3voto

msw Points 25319

Même rubular ne vous oblige pas à utiliser les parenthèses et la préséance de | est faible. A titre d'exemple, on peut citer a|bc ne correspond pas à ccc

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X