मैं आरएक्स के साथ एक गतिशील रेगेक्सपी कैसे बनाऊं?


15

मैं rxरनटाइम मान के साथ नियमित अभिव्यक्ति बनाने के लिए उपयोग करना चाहता हूं ।

वर्तमान में, मैं यह कर रहा हूँ:

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

हालाँकि, मैं इसके इस्तेमाल से बचना चाहता हूँ eval। मैंने पाया है rx-to-string, लेकिन यह स्पष्ट नहीं है कि मुझे क्या FORM लिखना चाहिए:

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

मैं rxरनटाइम पर एक अभिव्यक्ति कैसे बनाऊं ?

जवाबों:


18

rx-to-stringएक तर्क के रूप में regexp फॉर्म लेता है। वाक्य-विन्यास उसी के तर्क के समान है 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\\)\\_>"

8
"आप आरएक्स पर कई तर्क देते हैं, एक अंतर्निहित अनुक्रम ऑपरेटर है" - अहा! यही यहाँ का मुख्य गेटा है। धन्यवाद!
विल्फ्रेड ह्यूजेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.