2013-08-31 2 views
1

Я пытаюсь научиться писать emacs major-modes. В Интернете есть много отличных обучающих программ (например, http://www.emacswiki.org/emacs/GenericMode), но я изо всех сил пытаюсь изучить синтаксис соответствия регулярных выражений. Например, from this answer я пытаюсь понять, почемуlisp emacs regex синтаксис для основных режимов

'(("\"\\(\\(?:.\\|\n\\)*?[^\\]\\)\""

из

(define-derived-mode rich-text-mode text-mode "Rich Text" 
    "text mode with string highlighting." 

    ;;register keywords 
    (setq rich-text-font-lock-keywords 
     '(("\"\\(\\(?:.\\|\n\\)*?[^\\]\\)\"" 0 font-lock-string-face))) 
    (setq font-lock-defaults rich-text-font-lock-keywords) 
    (font-lock-mode 1)) 

соответствует либо между двойными кавычками. Этот материал: http://www.gnu.org/software/emacs/manual/html_node/elisp/Regexp-Special.html#Regexp-Special , похоже, не объясняет это.

Есть ли какие-то лучшие ресурсы там?

+0

При представлении узла «Regexp-Special», который, очевидно, охватывает некоторые особые случаи, вы должны быть в состоянии смотреть вверх на «Синтаксис регулярных выражений», а не на людей с правом голоса, пытающихся помочь. –

ответ

2

Ответ на ваш вопрос о том, что делает регулярное выражение --- Регулярное выражение в примере, который вы цитируете, фактически "\"\\(\\(?:.\\|\n\\)*?[^\\]\\)\"".

Части, чтобы соответствовать являются:

  • \", который соответствует только " символ --- это в начале и в конце регулярного выражения.

  • Группа, содержащая \\(?:.\\|\n\\)*?, а затем [^\\]. Предполагается, что группа существует так, что font-lock-keywords может быть предложено что-то сделать с этой частью совпадения, то есть с частью между совпадением " в начале и в конце.

  • \\(?:.\\|\n\\)*?, первая часть группы, соответствует нулю или нескольким символам --- любые символы. *? может быть только * (одно и тоже). . соответствует любому символу, кроме символа новой строки, а \n соответствует символу новой строки. \\| означает, что любой из них в порядке.

  • [^\\] соответствует любому символу, кроме обратной косой черты (\).

Таким образом, группируя его, группа соответствует нулю или нескольким символам, за которыми следует символ, который не является обратным слэшем. Почему бы просто не использовать регулярное выражение, совпадающее с нулевым или большим количеством символов между " символами? Предположительно, потому что человек хотел убедиться, что конец " не был экранирован (обратным слэшем). Однако обратите внимание, что регулярное выражение требует наличия по крайней мере одного символа между символами ", так что regexp не соответствует пустой строке, "".

Хороший ресурс: http://www.emacswiki.org/emacs/RegularExpression.

+0

Спасибо @ Drew, это очень полезно! Однако связанная с вами ссылка на ресурсы оставила меня в замешательстве. Это не объясняет, почему '\\' работает, или ':'. – DilithiumMatrix

+1

Лучший справочный документ о регулярных выражениях, который объясняет '' \\ и ':', - это руководство Elisp. Начните с узла 'Регулярные выражения'. Оба объясняются в узле 'Regexp Backslash'. См. Также узел «Синтаксис для строк» ​​для использования обратных косых черт в строках Lisp.Помните, что 'i' в Info - ваш друг для поиска вещей, а' g' переносит вас прямо на заданный узел – Drew