elisp에는 정규 표현식 리터럴이 있습니까?


14

내 정규 표현식에 필요한 백 슬래시 수는 상당히 미쳤습니다. elisp에는 정규 표현식 리터럴이 있으므로 다음과 같이 작성할 수 있습니다.

rx"some\(regexp\)"

대신에

"some\\(regexp\\)"

이맥스 같은 일부 정규 표현식 구문을 강조 \\|, \\(하고 \\). 불행히도, 많은 테마에서 이것은 보이지 않습니다. 이를 재정의 font-lock-regexp-grouping-backslash하고 font-lock-regexp-grouping-construct보다 뚜렷하게 만들 수 있습니다 .
Lindydancer

2
원시 문자열 리터럴을 지원 하는 패치 를 만들었지 만 개발자는 관심이 없습니다.
knarf

1
@ abo-abo의이 블로그 게시물에서와 같이 항상 표시되는 방식을 조정할 수 있습니다. oremacs.com/2015/01/11/pretty-elisp-regex
glucas

@knarf Stefan이 원시 문자열 지원에 관심이 없다는 것은 부끄러운 일입니다. 원시 문자열은 대체가 아닌 새로운 정규 표현식 구문 (보통)을 보완하기 때문입니다.
nosefrog

답변:


13

한 가지 옵션은 rx매크로를 사용하여 sexps를 사용하여 표현식을 구성하는 것입니다.

당신의 예는 (rx "some" (group "regexp"))

다음은 rx작동 방식에 대한 아이디어를 얻기 위해 rx.el의 주석 섹션에서 몇 가지 예입니다 .

^;;\\s-*\n\\|^\n 된다

(rx (or (and line-start ";;" (0+ space) ?\n)
        (and line-start ?\n)))

[ \t\n]*:\\([^:]+\\|$\\) 된다

(rx (and (zero-or-more (in " \t\n")) ":"
         (submatch (or line-end (one-or-more (not (any ?:)))))))

2
@knarf를 편집 해 주셔서 감사합니다! 전화를했는데 잘못 될 수있는 예를 넣고 싶지 않았습니다. :-)
glucas

우리는 실제로 많은 정규 표현식 검색을 사용하고 rx구문 때문에 perl에서 elisp로 대체하는 많은 스크립트를 옮기는 과정에 있어 유지 관리가 쉽습니다. 비슷한 경우, rx 구문 자체는 펄 파이썬, 루비 등을 대신 할만한 가치가 있습니다. 감사합니다.
gsl

7

그것은 정규 표현식 리터럴이 없지만 많은 사람들이 pcre2el 이 유용한 대안이라고 생각합니다.

구체적으로 다음과 같이 elisp에서 사용하십시오.

(rxt-pcre-to-elisp "(abc|def)\\w+\\d+")
   ;; => "\\(\\(?:abc\\|def\\)\\)[_[:alnum:]]+[[:digit:]]+"

그래도 여전히 백 슬래시를 두 배로 늘려야합니다. 평균 정규 표현식으로 많은 것을 필요로하지는 않습니다.
CJM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.