Merci à la réponse de Bart et à tous vos commentaires. Inspiré par Bart's, j'ai vérifié qu'emacs ne semble pas encore supporter le look-ahead. Mais dans l'esprit, je codé comme suit:
(defun string-match mais-exclusion (exclusion de chaîne regexp & de démarrage en option)
« Retour index de début du premier match pour regexp dans la chaîne, ou nul , mais excluent l'express régulier de l'exclusion. Matching ignore la casse si case-fold-search' is non-nil. If third arg start is non-nil, start search at that index in string. For index of first char beyond the match, do (match-end 0).
match fin « et` match début » donnent également des indices de sous-chaînes appariés par des constructions de parenthèses dans le motif.
Vous pouvez utiliser la fonction` match-string 'pour extraire les sous-chaînes apparié b y les constructions de parenthèses dans regexp «
(soit ((néant données))
(and (string-match regexp string start)
;; keep the match-data for recovery at the end.
(setq data (match-data))
(not (string-match (concat "[" exclusion "]") (match-string 0 string)))
(progn (set-match-data data) t) ; To recover the match data, and make sure it produces t as returned value
(match-beginning 0)
))
)
Donc, pour l'expression équivalente (?!) [[: punct:]]. string " '")
il serait
(string-match, mais-exclusion "[[: punct:]]" string "'")
Cela ferait l'affaire, mais pas aussi élégant. Cela devrait être un ajout mineur à emacs pour en faire un support intégré.
emacs prend en charge la classe de caractères maintenant.
Merci encore.
Yu
Emacs Lisp a son propre, ahem, * * unique syntaxe regex, et je doute qu'il soutient lookarounds. :-) – Ken
J'ai scanné la question pour trouver l'implémentation regex que Yu utilisait (qui n'en mentionne aucune), mais j'ai oublié de regarder le titre du post ... :) –
Ouais, en fait je suis confus, aussi: le manuel d'Emacs sur gnu.org dit "Les classes de caractères ne sont pas supportées, donc par exemple vous devriez utiliser '[0-9]' au lieu de '[[: digit:]]'.", Yu dit " [[: punct:]] + "fonctionne. – Ken