2011-06-17 10 views
9

इन दोनों regexes सफलतापूर्वक क्यों मेल खाते हैं?

if(preg_match_all('/$^/m',"",$array)) 
    echo "Match"; 

if(preg_match_all('/$^\n$/m',"\n",$array)) 
    echo "Match"; 

उत्तर

11

$ और ^ शून्य-चौड़ाई मेटा-वर्ण हैं। . जैसे अन्य मेटा-वर्णों के विपरीत जो एक समय में एक वर्ण से मेल खाते हैं (जब तक क्वांटिफायर के साथ उपयोग नहीं किया जाता है), वे वास्तव में शाब्दिक पात्रों से मेल नहीं खाते हैं। यही कारण है कि ^$ रिक्त स्ट्रिंग "" से मेल खाता है, भले ही रेगेक्स (सैन्स डिलीमीटर) में दो वर्ण होते हैं जबकि खाली स्ट्रिंग में शून्य होता है।

इससे कोई फर्क नहीं पड़ता कि एक खाली स्ट्रिंग में कोई वर्ण नहीं है। यह अभी भी एक शुरुआती बिंदु और एक अंतिम बिंदु है, और चूंकि यह एक खाली स्ट्रिंग है, दोनों एक ही स्थान पर हैं। इसलिए कोई फर्क नहीं पड़ता कि ^ और $ का ऑर्डर या नंबर आप उपयोग करते हैं, उनके सभी क्रमिक रिक्त स्ट्रिंग से मेल खाना चाहिए।


आपका दूसरा मामला थोड़ा मुश्किल है लेकिन समान सिद्धांत लागू होते हैं।

m संशोधक (PCRE_MULTILINE) बस पीसीआर इंजन को नई लाइनों के बावजूद, एक ही समय में पूरी स्ट्रिंग में फ़ीड करने के लिए कहता है, लेकिन स्ट्रिंग में अभी भी "एकाधिक रेखाएं" शामिल हैं। इसके बाद यह ^ और $ को "रेखा की शुरुआत" और "रेखा के अंत" के रूप में क्रमशः देखता है।

स्ट्रिंग "\n" अनिवार्य रूप से तार्किक तीन भागों में विभाजित किया गया है: "", "\n" और "" (क्योंकि न्यू लाइन खालीपन से घिरा हुआ है ... काव्यात्मक लगता है)।

तो इन मैचों का पालन करें:

  1. पहले रिक्त स्ट्रिंग से मिलान किया जाता है शुरू करने $^ (जैसा कि मैंने ऊपर की व्याख्या)।

  2. \n आपके regex में उसी \n से मेल खाता है।

  3. दूसरी खाली स्ट्रिंग अंतिम $ से मेल खाती है।

और इस तरह आपका दूसरा केस एक मैच में परिणाम देता है।

+0

हाँ यह बिंदु है! धन्यवाद – nEAnnam

+3

एक दिलचस्प तरफ के रूप में, मुझे यह परिदृश्य इस सवाल के समान लगता है कि खाली स्ट्रिंग स्वयं का एक सबस्ट्रिंग क्यों है। तो यह बिल्कुल एक बेवकूफ सवाल नहीं है। असल में मैंने इसे अभी उठा लिया है! – BoltClock

+0

+1 अच्छा जवाब। – BrunoLM

3

नहीं, यह नहीं है। असल में, अभिव्यक्ति $^ कभी मेल नहीं खाती, क्योंकि $ स्ट्रिंग के अंत का प्रतीक है जबकि ^ शुरुआत का प्रतिनिधित्व करता है। लेकिन जैसा कि हम जानते हैं, अंत स्ट्रिंग की शुरुआत से पहले नहीं आ सकता है :)

^$ एक खाली स्ट्रिंग से मेल खाना चाहिए, और केवल यही।

"लाइन की शुरुआत" मेटाएक्टेक्टर (^) केवल स्ट्रिंग की शुरुआत में ही मेल खाता है, जबकि "रेखा का अंत" मेटाएक्टेक्टर ($) केवल स्ट्रिंग के अंत में मेल खाता है, [...]

से PCRE manpages

ध्यान दें कि, PCRE_MULTILINE संशोधक जोड़ने पर, $ EOL हो जाता है और ^ बोल हो जाता है, यह (उनका कहना है कि बाहर के लिए netcoder धन्यवाद) से मेल खाएगी। फिर भी, मैं व्यक्तिगत रूप से इसका उपयोग नहीं करता।

+0

तो क्यों '$/$^\ n $/m', '\ n' – nEAnnam

+0

से मेल खाता है क्योंकि शायद यह आपके पसंदीदा रेगेक्स इंजन में एक बग है :) या शायद इसे इस तरह परिभाषित किया गया है। लेकिन यह तार्किक रूप से समझ में नहीं आता है और आपको इसका कभी भी उपयोग नहीं करना चाहिए। – fresskoma

+0

@ एनईएनाम: यह मेरे लिए कुछ भी मेल नहीं खाता है, और नहीं करना चाहिए। – BoltClock

0

रेगेक्स में, ^ स्ट्रिंग की शुरुआत से मेल खाता है, और $ स्ट्रिंग के अंत से मेल खाता है।

इसलिए, regex /^$/ सफलतापूर्वक पूरी तरह खाली स्ट्रिंग (और कुछ भी नहीं) से मेल खाता है।

/$^/ कुछ भी मेल नहीं खाएगा, क्योंकि तर्कसंगत रूप से आप इसकी शुरुआत से पहले स्ट्रिंग का अंत नहीं कर सकते हैं।

1

Regex.IsMatch ("", "$^") सी # में भी मैच। चूंकि यह एक खाली स्ट्रिंग है, इसलिए कोई आकार नहीं है। इंडेक्स -1 पर, यह एक साथ स्ट्रिंग के अंत और शुरुआत दोनों में है। अच्छा प्रश्न!

+1

एक आकार है ... यह 0 है। (क्षमा करें, मैं विरोध नहीं कर सका;) – BoltClock

+0

@ बोल्टक्लॉक। :-) मुझे कहना चाहिए था, 'कोई चम्मच नहीं है'। इस उदाहरण ने मेरे दिमाग को द मैट्रिक्स की तरह झुकाया! –

संबंधित मुद्दे