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-string引数として正規表現形式を取ります。構文はの引数と同じですrx

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

渡そうとしたのは、正規表現形式ではなく、正規表現形式のリストです。つまり、正規表現のシーケンスのsymbol-start後に、一連の文字列の1つが続きsymbol-end、その後にが続くため、シーケンス演算子sequenceseqまたは:、または奇妙に省略可能)でリードする必要があります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\\)\\_>"

7
「rxに複数の引数を渡します。暗黙のシーケンス演算子があります」-ああ!それがここの主な落とし穴です。ありがとう!
ウィルフレッドヒューズ14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.