Savoir quand et quoi échapper sans tentatives est nécessaire pour comprendre précisément la chaîne de contextes traversés par la chaîne. Vous spécifierez la chaîne du côté le plus éloigné à sa destination finale qui est la mémoire gérée par le code d'analyse regexp.
Soyez conscient de la façon dont la chaîne en mémoire est traitée: si peut être une chaîne simple à l'intérieur du code, ou une chaîne entrée dans la ligne de commande, mais a pourrait être soit une ligne de commande interactive soit une ligne de commande indiquée dans un fichier de script shell, ou à l'intérieur d'une variable en mémoire mentionnée par le code, ou un argument (chaîne) via une évaluation plus approfondie, ou une chaîne contenant du code généré dynamiquement avec n'importe quelle sorte d'encapsulation ...
Chacun de ce contexte a assigné des caractères avec des fonctionnalités spéciales.
Lorsque vous voulez passer le caractère littéralement sans utiliser sa fonction spéciale (locale au contexte), c'est le cas où vous devez l'échapper, pour le contexte suivant ... qui pourrait avoir besoin d'autres caractères d'échappement qui pourraient également avoir besoin d'être échappé dans le (s) contexte (s) précédent (s). De plus, il peut y avoir des choses comme le codage de caractères (le plus insidieux est utf-8 car il ressemble à ASCII pour les caractères communs, mais peut éventuellement être interprété même par le terminal en fonction de ses paramètres afin qu'il puisse se comporter différemment, puis l'attribut de codage de HTML / XML, il est nécessaire de bien comprendre le processus.
Par exemple, une expression rationnelle dans la ligne de commande commençant par perl -npe
, doit être transférée à un ensemble d' appels système exec se connectant en tant que canal que le fichier gère, chacun de ces appels système exec a juste une liste d'arguments qui ont été séparés par des espaces (non échappés), et éventuellement des tuyaux (|) et redirection (> N> N> & M), parenthèses, expansion interactive de *
et ?
,$(())
... (tout ceci sont des caractères spéciaux utilisés par le * sh qui peuvent sembler interférer avec le caractère de l'expression régulière dans le contexte suivant, mais ils sont évalués dans l'ordre: avant la ligne de commande. La ligne de commande est lue par un programme comme bash / sh / csh / tcsh / zsh, essentiellement à l'intérieur de guillemets doubles ou de guillemets simples, l'échappement est plus simple mais il n'est pas nécessaire de citer une chaîne dans la ligne de commande car la plupart du temps l'espace doit être préfixé avec une barre oblique inverse et la citation est il n'est pas nécessaire de laisser disponible la fonctionnalité de développement pour les caractères * et?, mais cette analyse est aussi différente du contexte que dans les guillemets. Ensuite, lorsque la ligne de commande est évaluée, l'expression rationnelle obtenue en mémoire (pas comme écrite dans la ligne de commande) reçoit le même traitement qu'elle serait dans un fichier source. Pour l'expression rationnelle, il y a un contexte de jeu de caractères entre crochets [],l'expression régulière perl peut être citée par un grand ensemble de caractères non alphanumériques (par exemple m // ou m: / better / for / path: ...).
Vous avez plus de détails sur les caractères dans d'autres réponses, qui sont très spécifiques au contexte d'expression rationnelle final. Comme je l'ai noté, vous mentionnez que vous trouvez l'échappement regexp avec des tentatives, c'est probablement parce que le contexte différent a un ensemble de caractères différent qui a confondu votre mémoire des tentatives (souvent la barre oblique inverse est le caractère utilisé dans ces différents contextes pour échapper à un caractère littéral au lieu de sa fonction ).
escape()
" pour permettre d'utiliser des chaînes arbitraires comme parties d'expressions régulières.