정규식 빌더로 작성된 정규식이 대화식 정규식과 다른 구문을 사용하는 이유는 무엇입니까?


26

따라서 정규식 작성기 (Mx re-builder)를 사용하여 \로 끝나는 줄을 찾는 경우 "\\ $"를 사용하고 검색 및 정규식으로 바꾸면 "\ $"만 걸립니다. 정규식 빌더가 직접 사용 가능한 표현식을 빌드 할 것으로 예상했을 때이 차이점을 설명하는 것은 무엇입니까?


6
코드에서 직접 사용할 수있는 표현식을 작성합니다.
abo-abo

1
@ abo-abo 내가 찾은 대답은 코드에서 사용할 수 있고 UI에서 사용할 수있는 것과 차이가 있다는 것을 알지 못했습니다. 리 빌더가 코드 구문을 사용한다는 것은 직관적이지 않지만 매뉴얼에서는 그렇지 않지만 차이점을 설명합니다.
user2699

2
대화식 검색을 작성하는 데 정규식 작성 기를 보다 유용하게 만들 려면 ReBuilder emacs 위키 페이지 , 특히 reb-query-replace함수 정의를 살펴보십시오 .
dfeich

답변:


29

실제로 네 가지 re-builder구문 옵션이 있으며 다음과 같은 구문 옵션을 사용할 수 있습니다.C-cTAB

두 사람은 sexp 형태의 정규 표현식 컴파일러위한 rxsregex(전자는보다 포괄적이고 거의 구문 호환 당신이 그것을 사용 된 코드로 작동하는 일이 않는 한, 당신이 정말로 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).

delightGNU ELPA 에서 패키지 를 설치하면 다음을 사용하여 모드 표시 줄에 구문 표시기를 추가 할 수 있습니다.

(let ((name '("Regexp[" (:eval (symbol-name reb-re-syntax)) "]")))
  (delight `((reb-mode ,name :major)
             (reb-lisp-mode ,name :major))))

read구문 에서 모드 이름이 "Regexp [read]"로 변경되고 다른 이름 도 마찬가지입니다.

또는 위에서 설명한 rxvs rx-to-stringgotcha에 대한 힌트를 포함 시키려면 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))))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.