8
votes

Quelqu'un peut-il expliquer ?: Expression régulière

TCL: Quelqu'un peut-il expliquer ?: Expression régulière

Je reçois la confusion entre? et ?:. P>

? signifie que le caractère précédent peut ou peut ne pas être présent. p>

alors je ne comprends pas quoi (? :) Indique. P>

Quelqu'un peut-il expliquer cela. P>

([0-9]+(?:\.[0-9]*)?)


4 commentaires

? a beaucoup d'utilisations spéciales dans des expressions régulières, sa signification dépend de ce qui est à gauche de celui-ci. Ces significations ne sont souvent pas liées les unes aux autres.


Eh bien, (? a beaucoup de significations en fonction des 1-2 prochains caractères.


@chx: Quels sont les personnages possibles pour changer le sens d'au ... dans (? :)


Je ne pense pas que je puisse éventuellement les énumérer, regardez régulier-expressions.info/refADV .html pour une tonne de possibilités: modificateurs de sous-expressions, lookaheads, conditionnels, puis sous-programmes comme Stackoverflow.com/questions/4941259/... décrit ici.


3 Réponses :


2
votes

?: ne crée pas simplement un groupe de capture. Par exemple A (?: B) correspondra à "AB" dans "ABC"


0 commentaires

2
votes

Comme mentionné dans le page manuelle RE_SYNTAX à partir de La documentation TCL, le ?: code> dans un groupe entre parenthèses éteint la capture de ce groupe. En d'autres termes, l'expression (\ d) (\ d) code> correspondrait à 2 chiffres et faire que chacun soit disponible dans un groupe de matchs séparé. L'expression (\ d) (?: \ D) code> est similaire mais ne fournit pas les correspondances dans des groupes de matchs distincts. Spécifiquement pour TCL:

regexp {(\d)(\d)} $data -> first second


3 commentaires

Ceci (? :) Syntaxe est seulement pour TCL ou peut être n'importe quelle langue qui utilise une expression régulière?


Il (? :) Peut être utilisé dans d'autres langues aussi. !!!


@ user2742564 Ce n'est pas universel, mais il est extrêmement courant parmi les moteurs avancés.



23
votes

Supposons que vous essayiez de rechercher quelque chose comme abc123 ou abc123.45 dans votre chaîne d'entrée et que vous vouliez capturer les lettres et les chiffres séparément. Vous utiliseriez une regex (un peu similaire à la vôtre) comme xxx

la regex ci-dessus correspondrait au ABC123.45 et fournit trois groupes, ce qui représente des sous-pièces de l'ensemble du match et sont décidés par où vous mettez ces () . Donc, compte tenu de notre regex (sans utiliser ?: ) nous avons obtenu xxx

maintenant, il peut ne pas avoir pour but de capturer la partie décimale toujours et Il a déjà été capturé dans notre groupe 2 aussi. Alors, comment allez-vous faire ce groupe () non capturant? Oui, en utilisant ?: au début comme xxx

maintenant, vous obtenez uniquement les deux groupes souhaités xxx < / Pré>

Avis, j'ai également changé la dernière partie de la regex de \. [0-9] * à \. [0-9] + . Cela empêcherait une correspondance sur 123. c'est-à-dire des chiffres sans une partie décimale mais ayant toujours un point.


0 commentaires