कुछ रेगेक्स कमांड्स में विभिन्न वर्णों के साथ '\' के विपरीत क्यों हैं?


10

उदाहरण के लिए, इस कमांड को लें:

find . -regex ".*\.\(cpp\|h\)"

यह आपकी निर्देशिका में सभी .h और .cpp फाइलें ढूंढेगा। अवधि चरित्र '।' नियमित अभिव्यक्तियों में आमतौर पर "किसी भी चरित्र" का अर्थ होता है। इसे केवल एक वास्तविक अवधि से मिलान करने के लिए, आपको बैकस्लैश वर्ण '\' का उपयोग करके इसे बचना चाहिए।

इस मामले में, एक विशेष अर्थ के साथ एक चरित्र दिया जाता है, आपको इसे वास्तविक चरित्र को प्राप्त करने के लिए बचना चाहिए।

अब, क्रमशः कोष्ठक और "या" बार, अक्षर '(', ')', और '' 'को लें। इनके विशेष अर्थ भी हैं, जिनका उपयोग नियमित अभिव्यक्तियों को समूहीकृत करने के लिए किया जाता है। हालांकि, विशेष अर्थ प्राप्त करने के लिए, बैकस्लैश का उपयोग करके वर्णों से बच जाना चाहिए! बैकलैश के बिना, वर्णों का वास्तविक चरित्र का अर्थ है जो इसका प्रतिनिधित्व करता है।

क्यों है '।' '(', ')', और '' से अलग तरह से व्यवहार किया जाता है?

जवाबों:


12

जवाब वास्तव में "सिर्फ इसलिए" है। विभिन्न नियमित अभिव्यक्ति सिंटैक्स का एक पूरा गुच्छा है, और जब वे एक समान उपस्थिति साझा करते हैं और आमतौर पर मूल बातें समान होती हैं, तो वे विवरणों में भिन्न होते हैं।

ऐतिहासिक रूप से, प्रत्येक उपकरण का अपना नया कार्यान्वयन था, जो भी लेखक ने सबसे अच्छा सोचा था। पात्रों के साथ विशेष और बिना भागने के बीच एक संतुलन है - बहुत सारे वर्ण जो "स्वाभाविक रूप से विशेष" हैं और आप अंत में उन पर मिलान करने के लिए हर समय उनसे बचते हैं; या, दूसरे तरीके से, आप सामान्य रेगेक्स सिंटैक्स जैसे () ग्रुपिंग का उपयोग करने के लिए पलायन का एक गुच्छा समाप्त करते हैं। और एक कार्यक्रम लिखने वाले सभी ने यह तय किया कि उनके कार्यक्रम के मुकाबले क्या हुआ, उनकी जरूरतों के आधार पर यह कैसे करना है, जो उन्होंने महसूस किया कि वह सही दृष्टिकोण था, और चंद्रमा के चरण पर।

POSIX से मानकीकरण का एक प्रयास है, जो " बुनियादी नियमित अभिव्यक्ति " और " विस्तारित नियमित अभिव्यक्ति " को परिभाषित करता है । अजीब तरह से, ये संबंध में एक-दूसरे से पीछे की ओर काम करते हैं \- कभी - कभी , लेकिन सही स्थिरता के साथ नहीं।

पर्ल रेगुलर एक्सप्रेशंस दो कारणों से एक और डिफैक्टो मानक बन गए हैं: पहला, वे बहुत लचीले और शक्तिशाली हैं, और दूसरा, वे वास्तव में बहुत समझदार हैं , "\ _ हमेशा एक गैर-अल्फ़ान्यूमेरिक चरित्र से बच जाते हैं" जैसे सम्मेलनों के साथ।

GNU फाइंड में एक -regextypeविकल्प है, जहाँ आप उपयोग किए गए नियमित अभिव्यक्ति सिंटैक्स को बदल सकते हैं। अफसोस की बात है, "पर्ल" एक विकल्प नहीं है, कम से कम मेरे पास खोजने के संस्करण में। (डिफ़ॉल्ट रूप से GNU, "emacs" से आश्चर्यजनक रूप से नहीं है, और यह वाक्यविन्यास यहाँ प्रलेखित है ।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.