Quelqu'un peut expliquer cette s'il vous plaît elisp regexp

voix
3

Quelqu'un peut expliquer s'il vous plaît l'expression rationnelle suivante, que je trouvais dans ediff-trees.el comme un cahier des charges pour lesquelles fichiers / répertoires à exclure de son processus de comparaison.

\\`\\(\\.?#.*\\|.*,v\\|.*~\\|\\.svn\\|CVS\\|_darcs\\)\\'

Bien que je sois un peu familier avec les expressions régulières rencontrant cette variante à base de chaîne-elisp m'a jeté.

Créé 17/08/2010 à 16:57
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
6

La première chose, rappelez-vous des expressions rationnelles de cette elisp doivent être échappé à la chaîne, ce qui a créé beaucoup de antislashs supplémentaires. Leur suppression, nous obtenons

\`\(\.?#.*\|.*,v\|.*~\|\.svn\|CVS\|_darcs\)\'

Ensuite, \ (et \) signifie le regroupement, "foo \ | bar" signifie "soit foo ou bar".

Ainsi, morceau par morceau, ce matchs regexp: soit un emacs fichier temporaire (quelque chose en commençant par #, éventuellement précédée d'une période:.?. # ), Ou un fichier RCS (se terminant par, v. , V), ou fichier de sauvegarde emacs (fin en ~:. * ~), ou un répertoire svn (.svn), ou un répertoire cvs (CVS), ou un répertoire darcs (de _darcs).

Modifier pour corriger: comme andre-r souligne à juste titre , le backtick \ `et unique citation \ » signifie essentiellement « début et à la fin de la chaîne » (respectivement). Cela signifie donc que l'expression rationnelle trouve des chaînes qui correspondent exactement à l' un des choix que j'ai décrites ci - dessus (la chaîne commence, puis vient l' un de ces choix, la chaîne se termine). Je l' avais déjà dit qu'ils voulaient dire en citant, je ne sais pas ce que je pensais :). Merci andre-r!

Créé 17/08/2010 à 17:13
source utilisateur

voix
4

Désolé, ce n'est pas vraiment une réponse; il est simplement un commentaire à la réponse de RBP. Mais je ne peux pas comprendre comment obtenir l'exemple de code pour bien rendre l'intérieur d'un commentaire, alors qu'il semble bien dans cette réponse.

En tous cas:

Je ne sais pas vous, mais je trouve

(rx bos (group (or (and (zero-or-one ".") "#" (zero-or-more nonl))
                   (and (zero-or-more nonl) ",v" )
                   (and (zero-or-more nonl) "~" )
                   ".svn"
                   "CVS"
                   "_darcs"
                   ))
    eos)

beaucoup plus facile à lire - et il est exactement équivalent.

Créé 17/08/2010 à 21:06
source utilisateur

voix
1

Parenthèses dans regexes elisp doivent être échappé. Les barres obliques inversées dans les chaînes doivent être échappé, si vous vous retrouvez avec \\(et \\)quand un analyseur regex raisonnable serait tout simplement utiliser (et ). Ne vous méprenez pas, je l' aime Emacs, mais d' avoir à échapper entre parenthèses dans une expression régulière était une très mauvaise idée. Les tuyaux et les périodes et les apostrophes inverses sont également échappé - c'est pourquoi vous avez cet enfer de doubles barres obliques inverses. Dépouilleront ceux -ci et vous obtenez (sous forme littérale regex):

`(.?#.*|.*,v|.*~|\.svn|CVS|_darcs)'

Voir cette question pour une discussion plus approfondie sur le sujet des parens échappées dans elisp.

Créé 17/08/2010 à 17:02
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more