Explication de l'exemple d'outil d'expressions régulières
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.
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?Si j'ai bien compris,
*?c'est la variante de*fonctionnement non gourmande .
Ce qui me déroute vraiment ... Le plus petit match possible pouranything?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
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").