rx-to-string
принимает форму регулярного выражения в качестве аргумента. Синтаксис такой же, как аргумент 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\\)\\_>"