web-dev-qa-db-fra.com

Regex:?: Notation (notation Point d'interrogation et deux points)

J'ai le texte suivant Java regex, que je n'ai pas écrit et que j'essaie de modifier:

^class-map(?:(\\s+match-all)|(\\s+match-any))?(\\s+[\\x21-\\x7e]{1,40})$
           ^                                 ^

C'est semblable à celui-ci .

Notez le premier point d'interrogation. Cela signifie-t-il que le groupe est facultatif? Il y a déjà un point d'interrogation après le ). Le côlon a-t-il une signification particulière dans la regex?

La regex se compile bien et il existe déjà des tests JUnit qui montrent comment cela fonctionne. C'est juste que je suis un peu confus quant à la raison pour laquelle le premier point d'interrogation et les deux points sont présents.

88
BJ Peter DeLaCruz

(?: démarre un groupe sans capture. Ce n'est pas différent de ( sauf si vous récupérez des groupes de la regex après utilisation. Voir Qu'est-ce qu'un groupe sans capture? Qu'est-ce qu'un point d'interrogation suivi de deux points (? :) signifie? .

130
ryanp

Un peu tard pour ce fil - juste pour construire sur la réponse de ryanp.

En supposant que vous ayez la chaîne aaabbbccc

Expression régulière

(a)+(b)+(c)+

Cela vous donnerait les 3 groupes suivants qui correspondent:

['a', 'b', 'c']

Expression régulière avec parenthèses non-capturantes

Utilisez le ?: dans le premier groupe

(?:a)+(b)+(c)+

et vous obtiendrez les groupes suivants qui correspondent:

['b', 'c']

C’est pourquoi on l’appelle "sans capture parenthèse"

Exemple d'utilisation:

Parfois, vous utilisez des parenthèses pour autre chose. Par exemple, pour définir les limites de la | ou opérateur:

"New (York|Jersey)"

Dans ce cas, vous utilisez uniquement les parenthèses pour le ou | _, et vous ne voulez pas vraiment capturer ces données. Utilisez la parenthèse sans capture pour indiquer que:

"New (?:York|Jersey)"
39
Martin Konecny