J'ai une regex Perl. Mais je ne suis pas certaine de ce que signifie "?" dans ce contexte.
m#(?:\\w+)#
Que signifie ?
ici?
J'ai une regex Perl. Mais je ne suis pas certaine de ce que signifie "?" dans ce contexte.
m#(?:\\w+)#
Que signifie ?
ici?
Dans ce cas, le ?
est en fait utilisé en relation avec le :
. Ensemble, ?:
au début d'un regroupement signifie regrouper mais ne pas capturer le texte/le modèle entre les parenthèses (c'est-à-dire, il ne sera pas stocké dans des renvois arrière comme \1
ou $1
, donc vous ne pourrez pas accéder directement au texte regroupé).
Plus spécifiquement, un ?
a trois significations distinctes en regex :
Le quantificateur ?
signifie "zéro ou une répétition" d'une expression. Un des exemples canoniques que j'ai vu est s?he
qui correspondra à la fois à she
et he
puisque le ?
rend le s
"optionnel".
Lorsqu'un quantificateur (+
, *
, ?
, ou le général {n,m}
) est suivi d'un ?
, alors la correspondance est non avide (c'est-à-dire, elle correspondra à la chaîne la plus courte à partir de cette position qui permet à la correspondance de se poursuivre).
Un ?
au début d'un groupe entre parenthèses signifie que vous souhaitez effectuer une action spéciale. Comme dans ce cas, :
signifie regrouper mais ne pas capturer. La liste exacte des actions disponibles variera quelque peu d'un moteur regex à un autre, mais voici quelques-unes (non nécessairement toutes incluses) :
A. Groupe non capturant : (?:text)
B. Lookaround : (?=a)
pour un regard en avant, ?!
pour un regard en arrière négatif, ou ?<=
et ? pour les regards en arrière (positif et négatif, respectivement). C. [Correspondances conditionnelles](http://www.regular-expressions.info/conditional.html) : `(?(condition)then|else)`. D. [Regroupement atomique](http://www.regular-expressions.info/atomic.html) : `a(?>bc|b)c` (correspond à `abcc` mais _pas_ `abc` ; voir le lien) E. [Activation/désactivation en ligne des modificateurs de correspondance regex](http://www.regular-expressions.info/modifiers.html) : `?i` pour activer un mode, `?-i` pour désactiver. Vous pouvez également activer/désactiver plusieurs modificateurs à la fois en les concaténant simplement, comme `?im` (`i` est insensible à la casse et `m` est multiline). F. [Groupes de capture nommés](http://www.regular-expressions.info/named.html) : `(?Ppattern)`, qui peuvent ensuite être référencés en utilisant `(?P=name)`. Le moteur regex .NET utilise la syntaxe `(?pattern)` à la place. G. [Commentaires](http://www.regular-expressions.info/comments.html) : `(?#Texte du commentaire)`. Personnellement, je pense que cela ajoute juste du désordre, mais je suppose que cela pourrait avoir une certaine utilité... le mode [free-spacing](http://www.regular-expressions.info/freespacing.html) pourrait être une meilleure option (le modificateur `(?x)`).
``
Essentiellement, le but du ?
est juste contextuel. Si vous vouliez zéro ou plusieurs répétitions d'un caractère littéral (
, vous devriez utiliser \(?
pour échapper à la parenthèse.
``
(?:...)
Regroupe les sous-expressions sans les capturer (cluster)
Vous pouvez également utiliser YAPE::Regex::Explain:
C:\\\\Temp> perl -MYAPE::Regex::Explain -e \\
"print YAPE::Regex::Explain->new(qr#(?:\\w+)#)->explain"
L'expression régulière:
(?-imsx:(?:\\w+))
correspond de la manière suivante:
NODE EXPLANATION
----------------------------------------------------------------------
(?-imsx: group, but do not capture (case-sensitive)
(with ^ and $ matching normally) (with . not
matching \\n) (matching whitespace and #
normally):
----------------------------------------------------------------------
(?: group, but do not capture:
----------------------------------------------------------------------
\\w+ caractères alphabétiques et numériques (a-z, A-Z, 0-9, \_) (1 ou
plusieurs fois (en trouvant le plus possible))
----------------------------------------------------------------------
) end of grouping
----------------------------------------------------------------------
) end of grouping
----------------------------------------------------------------------
En bref, la séquence (?
lance une fonctionnalité spéciale d'expression régulière. Ce qui suit le (?
spécifie la fonctionnalité spéciale, dans ce cas, un regroupement non capturant. Nous abordons cela à la fois dans Intermediate Perl et Effective Perl Programming. Les documents perlre les expressions régulières de Perl.
Voir le tutoriel sur les expressions régulières qui est installé avec chaque version de Perl (en particulier, cette section).
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.