Могут ли некоторые объяснить это элисп регулярное выражение - PullRequest
3 голосов
/ 17 августа 2010

Может ли кто-нибудь объяснить следующее регулярное выражение, которое я нашел в ediff-trees.el в качестве спецификации, какие файлы / каталоги исключать из процесса сравнения.

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

Хотя я немного знаком с регулярными выражениями, с которыми сталкивался этот вариант на основе строк elisp, меня отбросило.

Ответы [ 3 ]

6 голосов
/ 17 августа 2010

Во-первых, помните, что регулярные выражения elisp должны быть экранированы, что создает много дополнительных обратных слешей.Удаляя их, мы получаем

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

Тогда \ (и \) означают группировку, "foo \ | bar" означает "либо foo, либо bar".

Итак, по частям, это регулярное выражение соответствует: либо временному файлу emacs (что-то, начинающееся с #, возможно, с предшествующим точкой:.? #. ), либо RCS-файлу (заканчивающемуся, v:. , v), либофайл резервной копии emacs (оканчивающийся на ~:. * ~), или каталог svn (.svn), или каталог cvs (CVS), или каталог darcs (_darcs).

Изменить для исправления: as andre-r правильно указывает, обратный знак \ `и одинарная кавычка \ в основном означают" начало и конец строки "(соответственно).Таким образом, это означает, что регулярное выражение находит строки, которые точно соответствуют одному из вариантов, которые я обрисовал в общих чертах выше (т. Е. Строка начинается, затем идет один из этих вариантов, затем строка заканчивается).Я ранее говорил, что они имеют в виду цитаты, я не знаю, о чем я думал :).Спасибо andre-r!

4 голосов
/ 18 августа 2010

Извините, это не совсем ответ; Это просто комментарий к ответу. Но я не могу понять, как заставить пример кода хорошо визуализироваться внутри комментария, тогда как в этом ответе он выглядит хорошо.

В любом случае:

Я не знаю о тебе, но я нахожу

(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)

намного легче читать - и это в точности эквивалентно.

1 голос
/ 17 августа 2010

Скобки в регулярных выражениях elisp должны быть экранированы.Обратные слеши в строках должны быть экранированы, поэтому вы получите \\( и \\), когда любой разумный синтаксический анализатор регулярных выражений будет просто использовать ( и ).Не поймите меня неправильно, я люблю Emacs, но необходимость избегать скобок в регулярном выражении была действительно плохой идеей.Трубы, периоды и обратные тросы также избегаются - вот почему вы получили этот ад двойного обратного слеша.Вычеркните их, и вы получите (в регулярном виде):

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

См. этот вопрос для более подробного обсуждения вопроса о сбежавших паренах в elisp.

...