2009-12-12 9 views
2

Je veux faire correspondre toutes les ponctuations, mais pas "'", comme dans "I'm". Par exemple, dans la phrase ci-dessous:Expression régulière élégante pour correspondre à toutes les ponctuations mais pas "'" dans emacs Lisp?

I'm a student, but I'm also working. 
^not match ^match ^not   ^match 

je peux utiliser « [[:punct:]]+ » pour correspondre à tous les ponctuations, mais je vais avoir du mal à exclure « ' » du modèle correspondant.

Bien sûr, je pourrais utiliser quelque chose comme ce qui suit pour exprimer par énumération, mais c'est beaucoup fastidieux, surtout compte tenu de toutes ces ponctuations pour le chinois aussi. "[,.?!]"

Veuillez suggérer une solution plus élégante.

Merci à l'avance,

Yu

Répondre

1

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

3

Si votre goût regex prend en charge les regarder contournements, vous pouvez le faire:

(?!')[[:punct:]] 

En clair: s'il n'y a pas guillemet simple lors de la recherche à l'avance, correspondre à n'importe quel signe de ponctuation.

+0

Emacs Lisp a son propre, ahem, * * unique syntaxe regex, et je doute qu'il soutient lookarounds. :-) – Ken

+0

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 ... :) –

+0

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