rx로 동적 정규 표현식을 작성하는 방법


15

rx런타임 값으로 정규식을 만드는 데 사용하고 싶습니다 .

현재, 나는 이것을하고있다 :

(setq strings '("foo" "bar" "baz"))
(eval `(rx symbol-start (or ,@strings) symbol-end))

그러나 오히려 사용하지 않는 것이 eval좋습니다. 을 찾았 rx-to-string지만 어떤 양식을 작성해야하는지 명확하지 않습니다.

;; error: Unknown rx form `symbol-start
(rx-to-string '(symbol-start (or ,@strings) symbol-end))

rx런타임에 식을 작성 하는 방법

답변:


18

rx-to-stringregexp 형식을 인수로 사용합니다. 구문은의 인수와 동일합니다 rx.

(rx-to-string '(or "foo" "bar"))
"\\(?:\\(?:bar\\|foo\\)\\)"

전달하려고 한 것은 정규 표현식 양식이 아니라 정규 표현식 양식 목록입니다. 당신이 의미하는 것은 정규 표현식의 순서와 일련의 symbol-start문자열 중 하나가 뒤에 오는 것이므로 symbol-end순서 연산자 sequence( seq또는 약자 :또는 홀수 로 약칭 할 수 있음)를 사용해야 and합니다.

(rx-to-string `(: symbol-start (or ,@strings) symbol-end))
"\\(?:\\_<\\(?:ba[rz]\\|foo\\)\\_>\\)"

rx사실 rx-to-string매크로이기 때문에 컴파일 타임에 작동 하는 작은 래퍼 입니다. 이 혼동을 일으키는 것은에 여러 개의 인수를 전달 rx하면 암시 적 sequence연산자 가 있다는 것입니다 . 의 문서를 rx명확히 할 수 있습니다.

(rx (: symbol-start (or "foo" "bar" "baz") symbol-end))
"\\_<\\(?:ba[rz]\\|foo\\)\\_>"
(rx symbol-start (or "foo" "bar" "baz") symbol-end)
"\\_<\\(?:ba[rz]\\|foo\\)\\_>"

8
"여러 인수를 rx에 전달하면 암시 적 시퀀스 연산자가 있습니다"-aha! 이것이 주요 문제입니다. 감사!
Wilfred Hughes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.