Rx ile nasıl dinamik regexp oluşturabilirim?


15

Çalışma rxzamanı değerleri ile düzenli ifadeler oluşturmak için kullanmak istiyorum .

Şu anda bunu yapıyorum:

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

Ancak, kullanmaktan kaçınmayı tercih ederim eval. Buldum rx-to-string, ama ne FORM yazmam gerektiği açık değil:

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

Çalışma rxzamanında nasıl ifade oluştururum ?

Yanıtlar:


18

rx-to-stringargüman olarak normal ifade formunu alır. Sözdizimi, argümanıyla aynıdır rx.

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

Geçmeye çalıştığınız şey normal ifade formu değil, normal ifade formlarının listesidir. Ne demek istediğiniz düzenli ifadeler dizisi ve symbol-startonu takip eden bir dizi dizge symbol-endolduğu için, dizi işleciyle sequence( seqveya kısaca :veya garip bir şekilde kısaltılabilir and) yönlendirmeniz gerekir.

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

rxaslında rx-to-stringderleme zamanında çalışan küçük bir sargıdır çünkü bir makrodur. Bu kafa karıştırıcı kılan şey, eğer birden fazla argüman rxiletirseniz, örtük bir sequenceişleç olmasıdır. Dokümantasyonu rxaçıklığa kavuşturulabilir.

(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'e birden fazla argüman iletirsiniz, örtük bir dizi operatörü vardır" - aha! Buradaki ana sorun bu. Teşekkürler!
Wilfred Hughes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.