Puis-je utiliser un OR dans une regex sans capturer ce qui est inclus?


115

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.


Nice one +1 pour le lien vers rubular
bukowski

Réponses:


181

En fonction de l'implémentation de l'expression régulière, vous pouvez utiliser des groupes dits sans capture avec la syntaxe (?:…):

((?:a|b)c)

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)soit acou bc.


ça l'a fait! Merci pour la réponse ultra rapide. J'accepterai après l'expiration du délai (dont je ne savais pas l'existence).
goggin13

4
Je pensais que l'idée n'était pas de capturer le aou bdu tout. En d' autres termes, pour correspondre ac ou bc, mais seulement capturer le c:(?:a|b)(c)
Alan Moore

1
@AlanMoore Est-il possible de capturer l'un et pas l'autre dans l'instruction or? Je cherche donc le motif acou ab, mais je veux sortir absi abet seulement «c» est sorti est «ac».
Moondra

24

Si votre implémentation l'a, vous pouvez utiliser des parenthèses non capturantes:

(?:a|b)

@mmutz Merci pour la réponse rapide! J'aurais aimé pouvoir accepter les deux réponses, c'était exactement ce que je cherchais
goggin13

3

Même rubular ne vous oblige pas à utiliser des parenthèses et la priorité de |est faible. Par exemple, a | bc ne correspond pas à ccc


que fait l'opérateur '! ~'? J'aime votre expression, avec moins de parenthèses, l'expression
régulière

! ~ est un perlisme pour "ne correspond pas", c'était une écriture bâclée de ma part; fixe, merci.
msw

2
Je ne te comprends pas. La faible priorité de |est pourquoi vous ne devez parens d'utilisation. (?:a|b)ccorrespond à acou bc(le comportement souhaité), tandis que a|bccorrespond à aou bc.
Alan Moore

2

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

([ab]c)

il ne correspondra qu'à acou bcet il est plus lisible.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.