J'utilise rubular.com pour construire mon 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, disons que je veux capturer "ac" ou "bc". Je ne peux pas utiliser l'expression régulière
(a|b)(c)
droite? Depuis lors, je capture "a" ou "b" dans un groupe et "c" dans un autre, pas la même chose. Je sais que je peux filtrer les résultats capturés, mais cela semble être plus de travail ...
Est-ce que je rate quelque chose d'évident? J'utilise ceci en Java, si cela est pertinent.
regex
capture
regex-group
goggin13
la source
la source
Réponses:
En fonction de l'implémentation de l'expression régulière, vous pouvez utiliser des groupes dits sans capture avec la syntaxe
(?:…)
:Voici
(?:a|b)
un groupe mais vous ne pouvez pas référencer sa correspondance. Ainsi, vous ne pouvez référencer que la correspondance entre((?:a|b)c)
soitac
oubc
.la source
a
oub
du tout. En d' autres termes, pour correspondreac
oubc
, mais seulement capturer lec
:(?:a|b)(c)
ac
ouab
, mais je veux sortirab
siab
et seulement «c» est sorti est «ac».Si votre implémentation l'a, vous pouvez utiliser des parenthèses non capturantes:
la source
Même rubular ne vous oblige pas à utiliser des parenthèses et la priorité de
|
est faible. Par exemple, a | bc ne correspond pas à cccla source
|
est pourquoi vous ne devez parens d'utilisation.(?:a|b)c
correspond àac
oubc
(le comportement souhaité), tandis quea|bc
correspond àa
oubc
.Si vos alternatives OR sont toutes des caractères uniques - vous pouvez simplement utiliser l'opérateur "jeu de caractères":
il ne correspondra qu'à
ac
oubc
et il est plus lisible.la source