regex - एमएसीएस-लिस्प में नियमित अभिव्यक्ति को दोबारा भागने की आवश्यकता है-क्यों?




emacs elisp (3)

मैं एमएसीएस लिप के साथ खेल रहा हूं, और मैं नियमित अभिव्यक्ति खोज और प्रतिस्थापित करने के लिए एक छोटे से फ़ंक्शन लिखना चाहता था। नियमित रूप से काम करने के लिए मुझे नियमित रूप से काम करने के लिए एक समय की कसौटी थी क्योंकि मुझे नहीं पता था कि लिस्पी कोड लिखते समय सभी विशेष अक्षरों को बचने की ज़रूरत होती है (लेकिन क्वेरी-प्रति-रेज एक्सपी इंटरैक्टिव उपयोग करते समय नहीं!)।

इसलिए उदाहरण के लिए, query-replace-regexp इंटरैक्टिव रूप से आप उपयोग कर सकते हैं

^\(.*\)[\t]-.*$

लेकिन जब आप elisp कोड लिखते हैं तो आपको इस तरह से सब कुछ छोड़ने की आवश्यकता होती है:

^\\(.*\\)[\t]-.*$  

आखिरकार मैंने स्टीव येगेज लेख में इसके बारे में एक संदर्भ पाया, लेकिन मैं सोच रहा था कि किसी को पता था कि यह क्यों है?


आपके पास पहले से ही जवाब है, लेकिन इमैक के अंदर नियमित अभिव्यक्ति बनाने के लिए एक अंतर्निहित सहयोगी फिर से बिल्डर है

M-x re-builder

ऐसा इसलिए है क्योंकि आपको स्ट्रिंग्स में बैकस्लैश से बचने की आवश्यकता है। यदि आप बैकस्लैश से बचते नहीं हैं (स्ट्रिंग में यह सिर्फ हो जाता है (


स्कॉटफ्राज़िएर सही है, स्ट्रिंग पढ़ी जाने पर एक एस्केप पार्स किया जाता है, रेगुलर एक्सप्रेशन बनाते समय दूसरा पार्स किया जाता है यह काफी याद रखना आसान है, लेकिन यह एक दर्द हो सकता है, खासकर जब आप एक शाब्दिक बैकस्लैश '\' से मिलान करने का प्रयास कर रहे हैं आपको इसे चार बार '\\\\' करना पड़ता है क्योंकि आपको स्लैश के साथ दोनों प्रारंभिक स्ट्रिंग पार्स और नियमित अभिव्यक्ति पार्स में मिलान करने के लिए दो-स्लैश करना होगा।

और जब आप स्टैक अतिप्रवाह पर इस समस्या के बारे में लिखते हैं तो आपको 8 स्लैश का उपयोग करना पड़ता है क्योंकि मार्कडाउन एक एस्केप वर्ण के लिए स्लैश का उपयोग करता है





elisp