2013-08-31 12 views
1

나는 이맥스 메이저 모드를 작성하는 법을 배우려하고있다. 훌륭한 온라인 자습서가 많이 있습니다 (예 : http://www.emacswiki.org/emacs/GenericMode). 정규식 일치 구문을 배우려고 애쓰는 중입니다. 예를 들어, from this answer 나는lisp Emacs 주요 모드의 정규식 구문

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

따옴표 사이의 모든 항목과 일치하는 이유

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

에서 이해하려고 노력 중이 야. 이 자료는 : http://www.gnu.org/software/emacs/manual/html_node/elisp/Regexp-Special.html#Regexp-Special 은 설명 할 수없는 것 같습니다.

더 나은 리소스가 있습니까?

+0

"Regexp-Special"노드를 표시 할 때 특별한 경우가 분명히 나와있는 경우 도움을 요청하는 사람들을 다운 투표하지 않고 "Regexps의 구문"을 볼 수 있어야합니다. –

답변

2

정규식이 무엇을하는지에 대한 대답 --- 인용 한 예에서 regexp는 실제로는 "\"\\(\\(?:.\\|\n\\)*?[^\\]\\)\""입니다. 일치

부분은 있습니다 만 " 문자와 일치

  • \"은 --- 이것은 시작과 정규 표현식의 끝에있다.

  • \\(?:.\\|\n\\)*?을 포함하는 그룹,이어서 [^\\]을 포함하는 그룹. 이 그룹은 아마도 font-lock-keywords이 일치하는 부분, 즉 처음과 끝의 일치하는 " 사이의 부분으로 무엇인가를 수행하도록 명령받을 수 있습니다.

  • \\(?:.\\|\n\\)*? (그룹의 첫 번째 부분)은 0 개 이상의 문자 (모든 문자)와 일치합니다. *?은 단지 * 일 수 있습니다 (같은 것). .은 개행 문자를 제외한 모든 문자와 일치하고 \n은 개행 문자와 일치합니다. \\|은 그 중 하나가 정상임을 나타냅니다.

  • [^\\]은 백 슬래시 (\)를 제외한 모든 문자와 일치합니다.

이렇게 함께 묶으면 그룹은 0 개 이상의 문자와 일치하며 그 뒤에는 백 슬래시가 아닌 문자가옵니다. " 문자 사이에 0 개 이상의 문자와 일치하는 정규식을 사용하는 것이 가장 좋은 이유는 무엇입니까? 아마도 그 사람이 끝 부분 "이 (백 슬래시에 의해) 이스케이프되지 않았는지 확인하기를 원했기 때문일 것입니다. 그러나 regexp는 " 문자 사이에 적어도 하나의 char이 있어야 regexp가 빈 문자열 ""과 일치하지 않도록해야합니다.

좋은 자료는 http://www.emacswiki.org/emacs/RegularExpression입니다.

+0

감사합니다. @Drew, 매우 도움이됩니다. 그러나 당신이 포함시킨 리소스 링크는 나를 혼란스럽게 만들었습니다. 왜'\\'가 작동하는지,':'는 설명하지 않습니다. – DilithiumMatrix

+1

'\\'와':'에 대해 설명하는 regexps에 대한 최고의 참조 문서는 Elisp 매뉴얼입니다. 노드 정규 표현식으로 시작하십시오. 둘 다'Regexp Backslash' 노드에서 설명됩니다. Lisp 문자열에서 백 슬래시를 사용하기위한 node'Syntax for Strings '도 참고하십시오.Info에서'i'는 물건을 찾는 당신의 친구이고,'g'는 주어진 노드에 직접 연결된다는 것을 기억하십시오 – Drew