Ainsi, en utilisant le générateur d'expressions régulières (reconstructeur Mx), la recherche de lignes se terminant par \ prend "\\ $", tandis que dans la recherche et le remplacement par regex, cela ne prend que "\ $". Je m'attendais à ce que le constructeur d'expressions régulières crée des expressions directement utilisables, alors qu'est-ce qui explique cette différence?
elisp
regular-expressions
user2699
la source
la source
reb-query-replace
définition de la fonction.Réponses:
Il existe en fait quatre
re-builder
options de syntaxe différentes , et vous pouvez basculer entre elles avecC-cTABDeux sont pour les compilateurs d'expressions sexuelles sexp-form
rx
etsregex
(mais comme le premier est plus complet et presque entièrement compatible avec la syntaxe, vous pouvez vraiment ignorer sregex à moins que vous ne travailliez avec l'ancien code qui l'utilisait).Les deux autres options de syntaxe sont
read
(la valeur par défaut) etstring
(qui est la syntaxe que vous utilisez de manière interactive).La
read
syntaxe est la syntaxe du «code» - c'est-à-dire telle que reconnue par le lecteur lisp - dans laquelle vous entrez l'expression rationnelle selon la syntaxe de lecture pour les chaînes :C-hig
(elisp) Syntax for Strings
RETLa
string
syntaxe (que j'ai toujours considérée comme un nom inutilement déroutant dans ce contexte) est la syntaxe d'une chaîne d'expression régulière qui a déjà été lue , et qui n'a donc aucun caractère d'échappement requis lors de l' écriture de la chaîne. Autrement dit, il s'agit de la syntaxe d'expression régulière réelle , la même que celle que vous utilisez lorsque Emacs vous invite de manière interactive.Si vous souhaitez utiliser la syntaxe de chaîne par défaut, ajoutez ce qui suit à votre fichier init ou utilisez M-x
customize-option
RETreb-re-syntax
RETNotez que vous pouvez basculer entre la lecture et la syntaxe de chaîne lors de la modification de l'expression rationnelle, sans perte de données. Vous pouvez également passer des formes sexp à la syntaxe de lecture / chaîne (naturellement; la compilation de sexps en chaînes est à quoi ces bibliothèques sont destinées), mais vous ne pouvez pas aller dans l'autre sens et générer un sexp à partir d'une chaîne. re-builder se souvient de ce qu'était le sexp, donc vous ne perdez pas cette forme lorsque vous changez de syntaxe; mais il n'est pas non plus mis à jour si vous modifiez l'expression rationnelle dans une syntaxe différente, puis revenez en arrière. En bref, si vous construisez l'expression rationnelle en tant que sexp, assurez-vous de ne l'éditer qu'en utilisant cette syntaxe.
Un problème avec le
rx
support est qu'il utilise en fait larx-to-string
fonction, ce qui n'est pas tout à fait identique à l'utilisation de larx
macro dans le code.rx
accepte un nombre arbitraire d'arguments de formulaire et les traite comme une séquence implicite , alors qu'ilrx-to-string
n'accepte qu'un seul formulaire, et toute séquence de niveau supérieur doit être rendue explicite avec'(sequence ...)
ou équivalente.En bref, lorsque vous entrez un formulaire
'(...)
dans le reconstructeur, il est traité comme(rx-to-string '(...))
et non(rx ...)
Notez également qu'un formulaire non valide peut entraîner l'
re-builder
arrêt de la mise à jour dynamique des correspondances dans le tampon associé, même après que le formulaire est à nouveau validé. La C-cC-uliaison pourreb-force-update
est utile pour résoudre ces situations.Par défaut, la ligne de mode affiche "RE Builder" lors de l'utilisation de
read
ou lastring
syntaxe et "RE Builder Lisp" lors de l'utilisation de la syntaxerx
ousregex
, mais il semble beaucoup plus utile d'identifier la syntaxe spécifique utilisée (en particulier pour différencier entreread
etstring
).Si vous installez le
delight
package à partir de GNU ELPA, vous pouvez utiliser ce qui suit pour ajouter un indicateur de syntaxe à la ligne de mode.Cela change le nom du mode en "Regexp [lecture]" dans la
read
syntaxe, et de même pour les autres.Ou pour inclure un indice pour le
rx
vsrx-to-string
gotcha décrit ci-dessus, faites en sorte que la ligne de mode dise "Regexp [rx-to-string]" lors de l'utilisation de larx
syntaxe:la source