따라서 정규식 작성기 (Mx re-builder)를 사용하여 \로 끝나는 줄을 찾는 경우 "\\ $"를 사용하고 검색 및 정규식으로 바꾸면 "\ $"만 걸립니다. 정규식 빌더가 직접 사용 가능한 표현식을 빌드 할 것으로 예상했을 때이 차이점을 설명하는 것은 무엇입니까?
따라서 정규식 작성기 (Mx re-builder)를 사용하여 \로 끝나는 줄을 찾는 경우 "\\ $"를 사용하고 검색 및 정규식으로 바꾸면 "\ $"만 걸립니다. 정규식 빌더가 직접 사용 가능한 표현식을 빌드 할 것으로 예상했을 때이 차이점을 설명하는 것은 무엇입니까?
답변:
실제로 네 가지 re-builder
구문 옵션이 있으며 다음과 같은 구문 옵션을 사용할 수 있습니다.C-cTAB
두 사람은 sexp 형태의 정규 표현식 컴파일러위한 rx
과 sregex
(전자는보다 포괄적이고 거의 구문 호환 당신이 그것을 사용 된 코드로 작동하는 일이 않는 한, 당신이 정말로 sregex을 무시할 수 있습니다).
다른 두 가지 구문 옵션은 read
(기본값) 및 string
(대화식으로 사용하는 구문)입니다.
read
구문은 '코드'구문입니다 - 예를 혀짤배기 리더로 인정 - 당신이에 따라 정규 표현식을 입력 할 수있는 문자열에 대한 읽기 구문 :
C-hig (elisp) Syntax for Strings
RET
string
(난 항상 이런 상황에서 불필요하게 혼란 이름으로 간주 한) 구문은 정규 표현식 문자열의 구문은 이미 읽은 때 필요한 이스케이프, 어느 따라서 캐릭터의 어떤이없는 기록 문자열을. 다시 말해, 이것은 Emacs가 대화식으로 프롬프트 할 때 사용하는 것과 동일한 실제 정규 표현식 구문입니다.
기본적으로 문자열 구문을 사용하려면 init 파일에 다음을 추가하거나 M-x customize-option
RET reb-re-syntax
RET
(setq reb-re-syntax 'string)
정규식을 편집 할 때 데이터 손실없이 읽기 및 문자열 구문간에 전환 할 수 있습니다. 또한 전환 할 수 있습니다 에서 (; 문자열 sexps를 컴파일하면 해당 라이브러리가 무엇인지 자연스럽게),하지만 당신은 다른 방향으로 이동하여 문자열에서 sexp를 생성 할 수 없습니다 / 문자열 구문을 읽을 sexp 양식. 리 빌더는 sexp가 무엇인지 기억하므로 구문을 변경할 때 해당 형식을 잃지 않습니다 . 그러나 다른 구문으로 정규 표현식을 수정 한 다음 다시 변경하면 업데이트되지 않습니다. 즉, 정규 표현식을 sexp로 작성 하는 경우 해당 구문을 사용하는 동안에 만 정규 표현식을 편집하십시오 .
있는 잡았다 rx
지원은 실제로 사용하고 있다는 점이다 rx-to-string
사용하는 아주 동일하지 않은 기능, rx
코드에 매크로를. rx
임의의 수의 양식 인수를 허용하고이를 암시 적 시퀀스 로 취급 하지만 rx-to-string
단일 양식 만 허용하며 최상위 시퀀스는 명시 적이'(sequence ...)
거나 동등한 것으로 명시해야합니다 .
당신이 양식을 입력 할 때 즉, '(...)
다시 빌더, 그것은으로 처리 (rx-to-string '(...))
하지(rx ...)
또한 re-builder
양식이 다시 유효한 후에도 유효하지 않은 양식 으로 인해 연관된 버퍼에서 일치하는 항목의 업데이트가 동적으로 중지 될 수 있습니다 . C-cC-u바인딩은 reb-force-update
이러한 상황을 해결하는 데 유용합니다.
기본적으로 모드 라인 쇼 "RE 빌더"을 사용 read
또는 string
구문, 그리고 "RE 빌더 리스프"을 사용 rx
또는 sregex
구문,하지만 훨씬 더 유용 식별 보인다 특정의 사용 구문은 (특히 구별하기 read
등을 string
).
delight
GNU ELPA 에서 패키지 를 설치하면 다음을 사용하여 모드 표시 줄에 구문 표시기를 추가 할 수 있습니다.
(let ((name '("Regexp[" (:eval (symbol-name reb-re-syntax)) "]")))
(delight `((reb-mode ,name :major)
(reb-lisp-mode ,name :major))))
read
구문 에서 모드 이름이 "Regexp [read]"로 변경되고 다른 이름 도 마찬가지입니다.
또는 위에서 설명한 rx
vs rx-to-string
gotcha에 대한 힌트를 포함 시키려면 rx
구문을 사용할 때 모드 행을 "Regexp [rx-to-string]"으로 지정하십시오 .
(let ((name '("Regexp["
(:eval (symbol-name (if (eq reb-re-syntax 'rx)
'rx-to-string
reb-re-syntax)))
"]")))
(delight `((reb-mode ,name :major)
(reb-lisp-mode ,name :major))))