2010-08-17 7 views
3

일부는 비교 프로세스에서 제외 할 파일/디렉토리에 대한 사양으로 ediff-trees.el에서 찾은 다음 regexp에 대해 설명해주십시오.일부는이 설명을 할 수 있습니까? elisp regexp

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

비록이 정규 표현식을 만나는 정규식에 익숙하지만 문자열 기반 변형은 저를 버렸습니다.

답변

6

우선, elisp의 정규 표현식을 문자열 이스케이프 처리해야한다는 점을 기억하십시오. 많은 백 슬래시가 만들어졌습니다. 그들을 제거, 우리가, 그리고 \을

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

를 얻을 수 (와 \) 그룹화 의미 "foo는 \ | 바", "중 foo는, 또는 바"를 의미한다.

그래서이 정규 표현식은 emacs 임시 파일 (마침표가 #으로 시작하는 것 :.? # # ) 또는 RCS 파일 (끝 : v :.)과 일치합니다. , v) 또는 emacs 백업 파일 (~ :. * ~) 또는 svn 디렉토리 (.svn) 또는 cvs 디렉토리 (CVS) 또는 darcs 디렉토리 (_darcs).

올바른 수정 : andre-r이 올바르게 지적 했으므로, \\과 작은 따옴표는 기본적으로 "문자열의 시작과 끝"을 의미합니다. 그래서 이것은 정규 표현식이 위에서 요약 한 선택 사항 중 하나와 정확히 일치하는 문자열을 찾음을 의미합니다 (즉, 문자열이 시작되고 그 중 하나가 선택되면 문자열이 끝납니다). 나는 이전에 그들이 인용하는 것을 의미한다고 말했다. 나는 내가 생각하는 것을 모른다. :) 고마워 andre-r!

+0

\\'및 \ ' "은 빈 문자열과 일치하지만 일치하는 버퍼 또는 문자열의 시작 부분과 끝 부분에서만 일치합니다." –

+0

andre-r : 물론! 고맙습니다, 너무 많이 사용했습니다 : P 나는 그것을 반영하기 위해 나의 대답을 편집하고 있습니다. – rbp

1

elisp 정규 표현식의 괄호를 이스케이프 처리해야합니다. 문자열에서 백 슬래시를 이스케이프 처리해야하므로 합리적인 정규 표현식 파서가 ()을 사용하는 경우 \\(\\)이됩니다. 나를 잘못하지 마라. Emacs를 좋아하지만, 정규 표현식에서 괄호를 벗어나야한다는 것은 정말 나쁜 생각이다. 파이프와 마침표 및 역 따옴표도 이스케이프 처리됩니다. 바로이 때문에 이중 백 슬래시가 발생합니다. 그 밖으로 스트립 그리고 당신은 (정규식 문자 그대로의 형태로) 얻을 :

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

가 elisp에서 탈출 괄호의 주제에 대한 자세한 설명은 this question를 참조하십시오.

4

죄송합니다. 이것은 답변이 아닙니다. 이것은 rbp의 대답에 대한 설명 일뿐입니다. 하지만 코드 샘플을 주석 내부에 멋지게 렌더링하는 방법을 알아낼 수는 없지만이 답변에서는 괜찮습니다. 어쨌든

:

내가 당신에 대해 몰라,하지만 난

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

읽기 훨씬 쉽게 찾을 - 그리고 정확히 해당합니다.

+0

와우, 나는 rx.el에 대해 몰랐다. 실제로 매우 유용하고 훨씬 더 읽기 쉽다. 이것을 공유해 주셔서 대단히 감사합니다. – codeasone

+0

그건 아주 멋지다! +1 :) – rbp

관련 문제