Pourquoi les expressions régulières créées avec le générateur d'expressions régulières utilisent-elles une syntaxe différente des expressions régulières interactives?

26

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?

user2699
la source
6
Il construit des expressions directement utilisables dans le code.
abo-abo
1
@ abo-abo C'est la réponse que je cherchais, je ne savais pas qu'il y avait une différence entre ce qui est utilisable dans le code et ce qui est utilisable dans l'interface utilisateur. Il semble contre-intuitif que le reconstructeur utilise la syntaxe des codes, et le manuel ne le dit pas, mais cela explique la différence.
user2699
2
Afin de rendre regex builder plus utile pour la composition de recherches interactives, jetez un œil à la page wiki ReBuilder emacs , en particulier la reb-query-replacedéfinition de la fonction.
dfeich

Réponses:

29

Il existe en fait quatre re-builderoptions de syntaxe différentes , et vous pouvez basculer entre elles avecC-cTAB

Deux sont pour les compilateurs d'expressions sexuelles sexp-form rxet sregex(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) et string(qui est la syntaxe que vous utilisez de manière interactive).

La readsyntaxe 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 RET

La stringsyntaxe (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 RET reb-re-syntax RET

(setq reb-re-syntax 'string)

Notez 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 rxsupport est qu'il utilise en fait la rx-to-stringfonction, ce qui n'est pas tout à fait identique à l'utilisation de la rxmacro dans le code. rxaccepte un nombre arbitraire d'arguments de formulaire et les traite comme une séquence implicite , alors qu'il rx-to-stringn'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-builderarrê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 pour reb-force-updateest utile pour résoudre ces situations.


Par défaut, la ligne de mode affiche "RE Builder" lors de l'utilisation de readou la stringsyntaxe et "RE Builder Lisp" lors de l'utilisation de la syntaxe rxou sregex, mais il semble beaucoup plus utile d'identifier la syntaxe spécifique utilisée (en particulier pour différencier entre readet string).

Si vous installez le delightpackage à partir de GNU ELPA, vous pouvez utiliser ce qui suit pour ajouter un indicateur de syntaxe à la ligne de mode.

(let ((name '("Regexp[" (:eval (symbol-name reb-re-syntax)) "]")))
  (delight `((reb-mode ,name :major)
             (reb-lisp-mode ,name :major))))

Cela change le nom du mode en "Regexp [lecture]" dans la readsyntaxe, et de même pour les autres.

Ou pour inclure un indice pour le rxvs rx-to-stringgotcha décrit ci-dessus, faites en sorte que la ligne de mode dise "Regexp [rx-to-string]" lors de l'utilisation de la rxsyntaxe:

(let ((name '("Regexp["
              (:eval (symbol-name (if (eq reb-re-syntax 'rx)
                                      'rx-to-string
                                    reb-re-syntax)))
              "]")))
  (delight `((reb-mode ,name :major)
             (reb-lisp-mode ,name :major))))
phils
la source