के बीच अंतर '।' , '?' और नियमित अभिव्यक्ति में '*'?


21

क्या मुझे एक उदाहरण मिल सकता है कि कैसे इन तीन तत्वों (इन्हें मेटाचट्रैक्टर्स कहा जाता है?) में भिन्नता है।

मुझे पता है *कि सभी का मतलब है या कुछ भी नहीं है, लेकिन मुझे यकीन नहीं है कि अगर यह इसके बारे में सोचने का सही तरीका है। दूसरी ओर .और ?समान लगते हैं। वे एक चरित्र से मेल खाते हैं, है ना?



@ साइरस या इससे भी बेहतर: स्टैकऑवरफ्लो रेगेक्स डॉक्यूमेंटेशन
थॉमस अय्यूब

जवाबों:


16

विकिपीडिया से सीधे लिया गया :

? प्रश्न चिह्न शून्य या पूर्ववर्ती तत्व की एक घटना को इंगित करता है। उदाहरण के लिए, colou? R दोनों "रंग" और "रंग" से मेल खाता है।

*तारांकन पूर्ववर्ती तत्व के शून्य या अधिक घटनाओं को इंगित करता है। उदाहरण के लिए, ab * c "ac", "abc", "abbc", "abbbc" इत्यादि से मेल खाता है।

बड़ा अंतर यह है कि तारांकन शून्य या अधिक घटनाओं से मेल खाता है , जबकि प्रश्न चिह्न शून्य या एक घटना से मेल खाता है । इन दो उदाहरणों की तुलना करें:

$ printf "colour\ncolor\ncolouur\n" | egrep 'colou?r'                          
colour
color
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou*r'                          
colour
color
colouur

क्योंकि colouurअक्षर u (क्वालीफायर से पहले का पिछला तत्व ?) एक से अधिक बार हुआ है, इसका मिलान नहीं किया गया है ?, लेकिन इसके साथ मिलान किया गया है*

इसी तरह का उदाहरण:

$ printf "error\neror\ner\n" | egrep 'er?or'                                   
eror
$ printf "error\neror\ner\n" | egrep 'er*or'                                   
error
eror

उसी विकिपीडिया पृष्ठ से:

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

हमारे उदाहरण में,

$ printf "colour\ncolor\ncolouur\n" | egrep 'colo.r'                           
colour
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou.r'                          
colouur

उचित रूप से पर्याप्त, पिछले एक के रूप में पढ़ता है match any line that has "colou", plus any character, plus letter "r"

निष्कर्ष

आपने पूछा है: "मुझे पता है कि '*' का अर्थ सभी या कुछ भी नहीं है, लेकिन मुझे यकीन नहीं है कि यह इसके बारे में सोचने का सही तरीका है। दूसरे पर। ' & '?' समान लगते हैं। " जैसा कि आप देख सकते हैं, डॉट और तारांकन बिल्कुल समान नहीं हैं। डॉट किसी भी वर्ण पर संचालित होता है जो उस विशिष्ट स्थिति पर कब्जा कर सकता है, जबकि प्रश्न चिह्न पूर्ववर्ती तत्व पर संचालित होता है।


32

आप शेल ग्लब्स के साथ नियमित अभिव्यक्ति को भ्रमित कर सकते हैं

नियमित अभिव्यक्ति में वाक्यविन्यास .किसी भी एकल वर्ण (आमतौर पर न्यूलाइन वर्ण को छोड़कर) का प्रतिनिधित्व करता है, जबकि *एक क्वांटिफायर अर्थ शून्य या पूर्ववर्ती रेगेक्स परमाणु (चरित्र या समूह) से अधिक है। ?क्वांटिफायर का अर्थ है शून्य या पूर्ववर्ती परमाणु के एक उदाहरण, या (रेगेक्स वेरिएंट में जो इसका समर्थन करते हैं) एक संशोधक जो क्वांटिफायर व्यवहार को गैर-लालची के रूप में सेट करता है।

शेल ग्लब्स में, ?एकल वर्ण का प्रतिनिधित्व करता है (जैसे रेगेक्स का .) जबकि *शून्य या अधिक वर्णों के अनुक्रम का प्रतिनिधित्व करता है (rexx के बराबर .*)।

कुछ संदर्भ जो आपको मददगार लग सकते हैं, वे हैं http://www. अनियमित-expressions.info/quickstart.html और http://mywiki.wooledge.org/glob


6

नोट: Examples provided are in Python.हालांकि अवधारणा समान है।

'.'एक मेल प्रतीक है जो न्यूलाइन वर्ण को छोड़कर किसी भी वर्ण से मेल खाता है (यह भी re.DOTALLपायथन में तर्क के साथ ओवरराइड किया जा सकता है )। इसलिए इसे वाइल्डकार्ड भी कहा जाता है ।

'*'एक है परिमाणक (परिभाषित करता है कि कितनी बार एक तत्व हो सकता है)। {0,} के लिए छोटा है ।

इसका मतलब है "शून्य या उससे अधिक मिलान" - वह समूह जो स्टार से पहले होता है, पाठ में किसी भी संख्या में हो सकता है। यह पूरी तरह से अनुपस्थित या बार-बार दोहराया जा सकता है।

'?'एक क्वांटिफायर भी है । {0,1} के लिए छोटा है ।

इसका अर्थ है "मैच शून्य या इस प्रश्न चिह्न से पहले समूह में से एक।" इसकी व्याख्या भी की जा सकती है क्योंकि प्रश्न चिह्न से पहले का भाग वैकल्पिक है

उदाहरण के लिए:

pattern = re.compile(r'(\d{2}-)?\d{10}')
mobile1 = pattern.search('My number is 91-9999988888')
mobile1.group()
Output: '91-9999988888'

mobile2 = pattern.search('My number is 9999988888')
mobile2.group()
Output: '9999988888'

उपरोक्त उदाहरण '?' यह इंगित करता है कि पूर्ववर्ती दो अंक वैकल्पिक हैं। वे एक साथ सबसे अधिक बार घटित या घटित नहीं हो सकते हैं।

के बीच अंतर '।' तथा '?':

'.'नियमित अभिव्यक्ति में जिस स्थान पर पकड़ है, उसके लिए किसी एकल वर्ण को मैच / स्वीकार / सत्यापित करता है ।

उदाहरण के लिए:

pattern = re.compile(r'.ot')
pattern.findall('dot will identify both hot and got.')
Output: ['dot', 'hot', 'got']

'?'इससे पहले वाले समूह के शून्य या एकल घटना का मिलान / सत्यापन करता है

मोबाइल नंबर का उदाहरण देखें।

उसी के साथ जाता है '*'। यह समूह के शून्य या अधिक घटनाओं की जाँच करेगा ।

मेल:

'.*': उपलब्ध के रूप में कई अनुक्रम स्वीकार करता है। लालची दृष्टिकोण

'.*?'पहला मिलान क्रम स्वीकार करता है और रुक जाता है। गैर-लालची दृष्टिकोण

अधिक जानकारी के लिए, दो प्रश्नों को पढ़ने पर विचार करें ...

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