रेगेक्स बिल्डर के साथ बनाई गई नियमित अभिव्यक्तियाँ संवादात्मक नियमित अभिव्यक्तियों से अलग सिंटैक्स का उपयोग क्यों करती हैं?


26

इसलिए, रेग्युलर एक्सप्रेशन बिल्डर (Mx re-बिल्डर) का उपयोग करते हुए, ऐसी लाइनें ढूंढना जो अंत में \ "$ \" $ लेती हैं, जबकि regex द्वारा खोज और प्रतिस्थापित करने में, यह केवल "\" लेता है। मैं regex बिल्डर से सीधे प्रयोग करने योग्य अभिव्यक्तियों के निर्माण की उम्मीद करूँगा, तो इस अंतर के लिए क्या खाते हैं?


6
यह कोड में सीधे प्रयोग करने योग्य अभिव्यक्ति का निर्माण करता है।
abo-abo

1
@ abo-abo यह वह उत्तर है जिसकी मैं तलाश कर रहा था, मुझे महसूस नहीं हुआ कि कोड में प्रयोग करने योग्य और यूआई में प्रयोग करने योग्य के बीच अंतर है। ऐसा लगता है कि काउंटर-सहजता से री-बिल्डर कोड सिंटैक्स का उपयोग करता है, और मैनुअल नहीं कहता है, लेकिन यह अंतर बताता है।
user2699

2
इंटरएक्टिव खोजों की रचना के लिए रेगेक्स बिल्डर को अधिक उपयोगी बनाने के लिए, ReBuilder emacs wiki पृष्ठ , विशेष रूप से reb-query-replaceफ़ंक्शन परिभाषा पर एक नज़र डालें ।
डेफिच

जवाबों:


29

वास्तव में चार अलग re-builder- अलग वाक्यविन्यास विकल्प हैं, और आप उनके बीच स्विच कर सकते हैंC-cTAB

दो sexp-form regexp संकलक के लिए हैं rxऔर sregex(लेकिन जैसा कि पूर्व अधिक व्यापक और लगभग पूरी तरह से वाक्यविन्यास-संगत है, आप वास्तव में sregex को अनदेखा कर सकते हैं जब तक कि आप पुराने कोड के साथ काम नहीं करते हैं जो इसका उपयोग करते हैं)।

अन्य दो वाक्यविन्यास विकल्प हैं read(डिफ़ॉल्ट) और string(जो वाक्यविन्यास आप अंतःक्रियात्मक रूप से उपयोग करते हैं)।

readके रूप में तुतलाना पाठक द्वारा मान्यता प्राप्त यानी - - वाक्य रचना 'कोड' वाक्य रचना है जिसमें आप के अनुसार regexp दर्ज स्ट्रिंग्स के लिए पढ़ने के लिए वाक्य रचना :

C-hig (elisp) Syntax for Strings RET

stringवाक्य रचना (जो मैं हमेशा इस संदर्भ में एक अनावश्यक रूप से भ्रामक नाम पर विचार किया है) एक नियमित अभिव्यक्ति स्ट्रिंग की वाक्य रचना है जो पहले से ही पढ़ कर दिया गया है , और जो इसलिए चरित्र के किसी भी नहीं है बचाव के लिए आवश्यक है जब लेखन स्ट्रिंग। जो कहना है, यह वास्तविक नियमित अभिव्यक्ति सिंटैक्स है, जैसा कि आप उपयोग करते हैं जब Emacs आपको अंतःक्रियात्मक रूप से संकेत देता है।

यदि आप डिफ़ॉल्ट रूप से स्ट्रिंग सिंटैक्स का उपयोग करना चाहते हैं, तो अपनी इनिट फ़ाइल में निम्नलिखित जोड़ें, या उपयोग करें M-x customize-option RET reb-re-syntax RET

(setq reb-re-syntax 'string)

ध्यान दें कि आप regexp को संपादित करते समय रीड और स्ट्रिंग सिंटैक्स के बीच आगे और पीछे स्विच कर सकते हैं, जिसमें डेटा की कोई हानि नहीं होती है। तुम भी बदल सकते हैं से पढ़ने के लिए / स्ट्रिंग वाक्य रचना sexp रूपों (स्वाभाविक रूप से, तार करने के लिए sexps संकलन क्या उन पुस्तकालयों के लिए कर रहे हैं), लेकिन आप दूसरी दिशा में नहीं जा सकते हैं और एक तार से एक sexp उत्पन्न कर सकते हैं। री-बिल्डर को याद है कि सेक्सप क्या था, इसलिए जब आप सिंटैक्स बदलते हैं तो आप उस फॉर्म को नहीं खोते हैं ; लेकिन यह भी अद्यतन नहीं होता है यदि आप एक अलग वाक्यविन्यास में regexp को संशोधित करते हैं और फिर वापस बदलते हैं। संक्षेप में, यदि आप एक सेक्सप के रूप में regexp का निर्माण कर रहे हैं, तो सुनिश्चित करें कि आप उस वाक्य रचना का उपयोग करते समय केवल इसे संपादित करते हैं।


rxसमर्थन के साथ एक गोटा यह है कि यह वास्तव में rx-to-stringफ़ंक्शन का उपयोग कर रहा है, जो rxकोड में मैक्रो का उपयोग करने के लिए काफी समान नहीं है । rxमनमाने ढंग से संख्या तर्क को स्वीकार करता है और उन्हें एक निहित अनुक्रम के रूप में मानता है , जबकि rx-to-stringकेवल एक ही रूप को स्वीकार करता है, और किसी भी शीर्ष-स्तरीय अनुक्रम को स्पष्ट '(sequence ...)या समतुल्य बनाया जाना चाहिए ।

संक्षेप में, जब आप '(...)री-बिल्डर में एक फॉर्म दर्ज करते हैं , तो इसे संसाधित किया जाता है (rx-to-string '(...))और नहीं(rx ...)

यह भी ध्यान रखें कि अवैध रूप re-builderसे संबंधित बफर में मैचों को गतिशील रूप से अपडेट करने से रोकने के लिए, भले ही फॉर्म को फिर से वैध बना दिया जाए। C-cC-uबंधन के लिए reb-force-updateइन स्थितियों को हल करने के लिए उपयोगी है।


डिफ़ॉल्ट रूप से मोड लाइन "रे बिल्डर" का उपयोग करते समय readया stringसिंटैक्स का उपयोग करता है, और "रे बिल्डर लिस्प" का उपयोग rxया sregexसिंटैक्स करते समय , लेकिन उपयोग में विशिष्ट सिंटैक्स की पहचान करने के लिए यह कहीं अधिक उपयोगी लगता है (विशेष रूप से readऔर बीच में अंतर करने के लिए string)।

यदि आप delightGNU ELPA से पैकेज स्थापित करते हैं , तो आप सिंटैक्स इंडिकेटर को मोड लाइन में जोड़ने के लिए निम्नलिखित का उपयोग कर सकते हैं।

(let ((name '("Regexp[" (:eval (symbol-name reb-re-syntax)) "]")))
  (delight `((reb-mode ,name :major)
             (reb-lisp-mode ,name :major))))

यह readसिंटैक्स में "Regexp [रीड]" मोड का नाम बदल देता है , और इसी तरह दूसरों के लिए।

या ऊपर वर्णित rxबनाम rx-to-stringगेटा के लिए एक संकेत शामिल करने के लिए , rxसिंटैक्स का उपयोग करते समय मोड लाइन को "रेगेक्सप [आरएक्स-टू-स्ट्रिंग]" कहें।

(let ((name '("Regexp["
              (:eval (symbol-name (if (eq reb-re-syntax 'rx)
                                      'rx-to-string
                                    reb-re-syntax)))
              "]")))
  (delight `((reb-mode ,name :major)
             (reb-lisp-mode ,name :major))))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.