rx-to-string
lấy một hình thức regex làm đối số. Cú pháp giống như đối số của rx
.
(rx-to-string '(or "foo" "bar"))
"\\(?:\\(?:bar\\|foo\\)\\)"
Những gì bạn đã cố gắng vượt qua không phải là một hình thức regex, mà là một danh sách các hình thức regex. Vì ý của bạn là chuỗi các biểu thức chính quy được symbol-start
theo sau bởi một chuỗi các chuỗi theo sau symbol-end
, nên bạn cần phải dẫn đầu với toán tử trình tự sequence
(có thể được viết tắt thành seq
hoặc :
, hoặc thậm chí kỳ lạ and
).
(rx-to-string `(: symbol-start (or ,@strings) symbol-end))
"\\(?:\\_<\\(?:ba[rz]\\|foo\\)\\_>\\)"
rx
thực tế là một trình bao bọc nhỏ xung quanh rx-to-string
hoạt động vào thời gian biên dịch vì nó là một macro. Điều làm cho điều này trở nên khó hiểu là nếu bạn truyền nhiều đối số cho rx
, có một sequence
toán tử ẩn . Các tài liệu của rx
có thể đứng để được làm rõ.
(rx (: symbol-start (or "foo" "bar" "baz") symbol-end))
"\\_<\\(?:ba[rz]\\|foo\\)\\_>"
(rx symbol-start (or "foo" "bar" "baz") symbol-end)
"\\_<\\(?:ba[rz]\\|foo\\)\\_>"