rx-to-string
nimmt eine reguläre Ausdrucksform als Argument an. Die Syntax entspricht dem Argument von rx
.
(rx-to-string '(or "foo" "bar"))
"\\(?:\\(?:bar\\|foo\\)\\)"
Was Sie versucht haben zu übergeben, ist kein regulärer Ausdruck, sondern eine Liste von regulären Ausdrücken. Da Sie damit die Folge von regulären Ausdrücken, symbol-start
gefolgt von einer Reihe von Zeichenfolgen symbol-end
, meinen , müssen Sie mit dem Sequenzoperator sequence
(der mit seq
oder abgekürzt werden kann :
, oder seltsamerweise sogar and
) beginnen.
(rx-to-string `(: symbol-start (or ,@strings) symbol-end))
"\\(?:\\_<\\(?:ba[rz]\\|foo\\)\\_>\\)"
rx
ist in der Tat ein winziger Wrapper rx-to-string
, der zur Kompilierungszeit ausgeführt wird, da es sich um ein Makro handelt. Das Verwirrende daran ist, dass rx
es einen impliziten sequence
Operator gibt, wenn Sie mehrere Argumente übergeben . Die Dokumentation von rx
könnte noch geklärt werden.
(rx (: symbol-start (or "foo" "bar" "baz") symbol-end))
"\\_<\\(?:ba[rz]\\|foo\\)\\_>"
(rx symbol-start (or "foo" "bar" "baz") symbol-end)
"\\_<\\(?:ba[rz]\\|foo\\)\\_>"