Explication de l'exemple d'outil d'expressions régulières

Oct 19 2020

La lecture de la section des expressions régulières dans EmacsWiki apparaît comme suit :

You can use a tool to construct regexps. For example, you can use ‘rx’ like this:

(rx (or (and "\*" (*? anything) "*/") (and "//" (*? anything) eol)))

To produce this regexp (which matches C-style multiline and single line comments):

\\*\\(?:.\\|\n\\)*?\\*/\\|//\\(?:.\\|\n\\)*?$

J'obtiens la orcorrespondance entre les commentaires multilignes de style C ou C / C ++ sur une seule ligne.
Mais je n'obtiens pas les andpièces.

  1. Je ne sais pas comment anythingfonctionne et je suppose que cela correspondra à n'importe quel caractère.
    Cela pourrait être quelque chose d'équivalent .*. Vraiment?

  2. Si j'ai bien compris, *?c'est la variante de *fonctionnement non gourmande .
    Ce qui me déroute vraiment ... Le plus petit match possible pour anything?

  3. Pourquoi l'ouverture multiligne de style C est-elle représentée par "\ *" ? Je soupçonne que c'est une faute de frappe sur EmacsWiki et cela devrait être "/ *" .

Réponses

1 xuchunyang Oct 19 2020 at 19:49

anythingcorrespond à n'importe quel caractère, tandis que l'expression rationnelle .correspond à n'importe quel caractère sauf une nouvelle ligne, la représentation rx est not-newline.

*?correspond à zéro ou plus, non gourmand. Extrayons le commentaire du code C:

/* comment */ char *s = "*/";
;; * is zero-or-more, greedy
(let ((string "/* comment */ char *s = \"*/\""))
  (when (string-match (rx "/*" (* anything) "*/") string)
    (match-string 0 string)))
;; => "/* comment */ char *s = \"*/"

;; *? is zero-or-more, non-greedy
(let ((string "/* comment */ char *s = \"*/\""))
  (when (string-match (rx "/*" (*? anything) "*/") string)
    (match-string 0 string)))
;; => "/* comment */"

Vérifiez la documentation via Ch f rx ou (info "(elisp) Rx Notation").