एेतिहाँसिक विचाराे से
विकिपीडिया लेख नियमित अभिव्यक्तियों की उत्पत्ति के बारे में काफी विस्तृत है (क्लेन, 1956)। मूल वाक्य रचना के साथ ही अपेक्षाकृत सरल था *
, +
, ?
, |
और समूहीकरण (...)
। यह ट्रिब्यूट था ( और पठनीय, दोनों का विरोध जरूरी नहीं है), क्योंकि औपचारिक भाषाएं ट्रिट गणितीय अंकन के साथ व्यक्त की जाती हैं।
बाद में, सिंटैक्स और क्षमताएं संपादकों के साथ विकसित हुईं और पर्ल के साथ बढ़ीं , जो डिजाइन द्वारा ट्रिब्यूट करने की कोशिश कर रहा था ( "सामान्य निर्माण कम होना चाहिए" )। इसने वाक्यविन्यास को बहुत जटिल कर दिया, लेकिन ध्यान दें कि लोग अब नियमित अभिव्यक्तियों के आदी हो गए हैं और लिखने में अच्छे हैं (यदि नहीं पढ़ रहे हैं)। तथ्य यह है कि वे कभी-कभी केवल लिखने का सुझाव देते हैं कि जब वे बहुत लंबे होते हैं, तो वे आम तौर पर सही उपकरण नहीं होते हैं।
गालियां देते समय नियमित अभिव्यक्तियां अपठनीय होती हैं।
स्ट्रिंग-आधारित नियमित अभिव्यक्तियों से परे
वैकल्पिक वाक्यविन्यास के बारे में बोलते हुए, आइए एक नज़र डालते हैं जो पहले से मौजूद है ( सीएल-पीपीसीआर , कॉमन लिस्प में )। आपकी लंबी नियमित अभिव्यक्ति ppcre:parse-string
को निम्न प्रकार से पार्स किया जा सकता है:
(let ((*print-case* :downcase)
(*print-right-margin* 50))
(pprint
(ppcre:parse-string "^(?:([A-Za-z]+):)?(\\/{0,3})(0-9.\\-A-Za-z]+)(?::(\\d+))?(?:\\/([^?#]*))?(?:\\?([^#]*))?(?:#(.*))?$")))
... और निम्नलिखित रूप में परिणाम:
(:sequence :start-anchor
(:greedy-repetition 0 1
(:group
(:sequence
(:register
(:greedy-repetition 1 nil
(:char-class (:range #\A #\Z)
(:range #\a #\z))))
#\:)))
(:register (:greedy-repetition 0 3 #\/))
(:register
(:sequence "0-9" :everything "-A-Za-z"
(:greedy-repetition 1 nil #\])))
(:greedy-repetition 0 1
(:group
(:sequence #\:
(:register
(:greedy-repetition 1 nil :digit-class)))))
(:greedy-repetition 0 1
(:group
(:sequence #\/
(:register
(:greedy-repetition 0 nil
(:inverted-char-class #\? #\#))))))
(:greedy-repetition 0 1
(:group
(:sequence #\?
(:register
(:greedy-repetition 0 nil
(:inverted-char-class #\#))))))
(:greedy-repetition 0 1
(:group
(:sequence #\#
(:register
(:greedy-repetition 0 nil :everything)))))
:end-anchor)
यह वाक्यविन्यास अधिक क्रियात्मक है, और यदि आप नीचे टिप्पणियों को देखते हैं, तो जरूरी नहीं कि अधिक पठनीय हो। इसलिए यह मत समझिए कि क्योंकि आपके पास कम कॉम्पैक्ट सिंटैक्स है, इसलिए चीजें अपने आप साफ हो जाएंगी ।
हालाँकि, यदि आपको अपने नियमित भावों से परेशानी होने लगती है, तो उन्हें इस प्रारूप में बदलने से आपको अपने कोड को समझने और डीबग करने में मदद मिल सकती है। यह स्ट्रिंग-आधारित प्रारूपों पर एक लाभ है, जहां एक एकल चरित्र त्रुटि को स्पॉट करना मुश्किल हो सकता है।
इस सिंटैक्स का मुख्य लाभ स्ट्रिंग-आधारित एन्कोडिंग के बजाय एक संरचित प्रारूप का उपयोग करके नियमित अभिव्यक्तियों में हेरफेर करना है। यह आपको अपने कार्यक्रम में किसी भी अन्य डेटा-संरचना की तरह ऐसे भावों की रचना और निर्माण करने की अनुमति देता है । जब मैं उपरोक्त सिंटैक्स का उपयोग करता हूं, तो यह आम तौर पर होता है क्योंकि मैं छोटे भागों से अभिव्यक्ति का निर्माण करना चाहता हूं (यह भी देखें कि मेरा कोडगॉल्फ उत्तर )। आपके उदाहरण के लिए, हम 1 लिख सकते हैं :
`(:sequence
:start-anchor
,(protocol)
,(slashes)
,(domain)
,(top-level-domain) ... )
स्ट्रिंग-आधारित नियमित अभिव्यक्तियों को भी बनाया जा सकता है, स्ट्रिंग कंसंट्रेशन और हेल्पर कार्यों में लिपटे हुए प्रक्षेप का उपयोग करके। हालांकि, वहाँ स्ट्रिंग जोड़तोड़ के साथ सीमाएं जो करते हैं कर रहे हैं को अस्त-व्यस्त कोड (नेस्टिंग समस्याओं, बैकटिक विपरीत बनाम नहीं के बारे में सोचना $(...)
बैश में, यह भी, बच पात्रों आप सिर दर्द दे सकता है)।
यह भी ध्यान दें कि उपरोक्त प्रपत्र (:regex "string")
रूपों की अनुमति देता है ताकि आप पेड़ों के साथ उलटी धारणाओं को मिला सकें। यह सब IMHO को अच्छी पठनीयता और रचनाशीलता की ओर ले जाता है; यह अप्रत्यक्ष रूप से (अर्थात, नियमित अभिव्यक्ति की भाषा में नहीं) द्वारा व्यक्त की गई तीन समस्याओं को संबोधित करता है ।
समाप्त करने के लिए
अधिकांश प्रयोजन के लिए, कविता का अंकन वास्तव में पठनीय है। विस्तारित नोटेशन से निपटने में कठिनाइयाँ होती हैं, जिसमें पीछे हटना आदि शामिल हैं, लेकिन उनका उपयोग शायद ही कभी उचित होता है। नियमित अभिव्यक्ति के अनुचित उपयोग से अपठनीय अभिव्यक्ति हो सकती है।
नियमित अभिव्यक्तियों को स्ट्रिंग्स के रूप में एन्कोड नहीं किया जाना चाहिए। आप एक पुस्तकालय या एक उपकरण बनाने और उसे नियमित अभिव्यक्ति रचना में मदद कर सकते हैं, तो आप करेंगे बचने स्ट्रिंग जोड़तोड़ से संबंधित संभावित कीड़े का एक बहुत।
वैकल्पिक रूप से, औपचारिक व्याकरण अधिक पठनीय होते हैं और नामकरण और अमूर्त उप-अभिव्यक्तियों में बेहतर होते हैं। टर्मिनलों को आम तौर पर सरल नियमित अभिव्यक्तियों के रूप में व्यक्त किया जाता है।
1. आप पठन-पाठन में अपने भावों का निर्माण करना पसंद कर सकते हैं, क्योंकि नियमित अभिव्यक्तियाँ किसी अनुप्रयोग में स्थिर होती हैं। देखें create-scanner
और load-time-value
:
'(:sequence :start-anchor #.(protocol) #.(slashes) ... )