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.
(?:
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? .
Un peu tard pour ce fil - juste pour construire sur la réponse de ryanp.
En supposant que vous ayez la chaîne aaabbbccc
(a)+(b)+(c)+
Cela vous donnerait les 3 groupes suivants qui correspondent:
['a', 'b', 'c']
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"
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)"