2013-07-29 6 views
5

मैंने http://regexcrossword.com/ पर मजाकिया रेगेक्स क्रॉसवर्ड किया - और पता चला कि मुझे समझ में नहीं आता कि समूह का क्या मतलब है, उदा। (।) (।) + या *रेगेक्स, समूह और क्वांटिफायर

मुझे http://ole.michelsen.dk/tools/regex.html पर कोशिश करते हैं, यह जावास्क्रिप्ट और PHP regex इंजन प्रदान करता है: "Trololo"

स्ट्रिंग के खिलाफ मैच के लिए है (उद्धरण चिह्नों के बिना)। ("ग्लोबल मैच" कुछ बदल गया है, यह, कि जे एस है 'दुरुस्त संस्करण के रूप में जोड़ा जाता है यह पीएचपी मोड में कुछ भी नहीं बदला है। चालू हैं)

JS, (.)+ => 0: Trololo! 1: ! 
JS', (.)+ => 0: Trololo! 
PHP, (.)+ => 0: Trololo! 0: ! 
JS, (.)* => 0: Trololo! 1: ! 
JS', (.)* => 0: Trololo! 
PHP, (.)* => 0: Trololo! 1: 0: ! 1: 
JS, (.){5} => 0: Trolo 1: o 
JS', (.){5} => 0: Trolo 
PHP, (.){5} => 0: Trolo 0: o 
JS, (.){4} => 0: Trol 1: l 
JS', (.){4} => 0: Trol 1: olo! 
PHP, (.){4} => 0: Trol 1: olo! 0: l 1: ! 

किसी भी प्रामाणिक जवाब वहाँ क्या है इसका अर्थशास्त्र है?

+0

'जेएस' और' जेएस 'क्या है? क्या फर्क पड़ता है? –

+1

मुझे लगता है कि साइट आपको सही समूह नहीं दे रही है। इसके बजाए http://www.regexplanet.com/ का प्रयोग करें। –

उत्तर

3

आउटपुट सही ढंग से लेबल नहीं किए गए हैं, बस इतना ही है।

सबसे पहले, होना चाहिए? यदि आप समूह को दोहराते हैं, तो प्रत्येक नया उदाहरण अंतिम कैप्चर को ओवरराइट करता है। यदि समूह का उपयोग नहीं किया जाता है तो यह एक खाली स्ट्रिंग या जेएस में undefined जैसे कुछ वापस लौटाएगा (यह स्वाद पर निर्भर करता है)। इस मामले पर regular-expressions.info पर एक अच्छा लेख है।

अब हम आपके परिणामों को कैसे प्राप्त कर सकते हैं? चलो जावास्क्रिप्ट के साथ शुरू करते हैं।

JS (गैर-वैश्विक वाले) लेबल वाले सभी उदाहरण उपर्युक्त वर्णन में फिट हैं। वे 0 में वर्णों की वांछित मात्रा से मेल खाते हैं और 1 में अंतिम वर्ण कैप्चर करते हैं। तो हम इन्हें अनदेखा कर सकते हैं।

वैश्विक लोगों के साथ क्या है? यहां आउटपुट गलत तरीके से व्याख्या किया गया था। जब आप String.match() फ़ंक्शन के साथ वैश्विक ध्वज का उपयोग करते हैं, तो आपको अब सभी कैप्चर की सरणी नहीं मिलती है - लेकिन प्रत्येक मैच के लिए केवल सभी मैचों की एक सरणी (समूह 0)। इसलिए, +, * और {5} के मामले में जहां केवल एक मैच है, आपको केवल एक ही परिणाम मिलता है। {4} के साथ लक्ष्य स्ट्रिंग में दो मैचों के लिए पर्याप्त जगह है, इसलिए परिणामस्वरूप सरणी में दो तत्व होते हैं। वैश्विक ध्वज के साथ सभी कैप्चर प्राप्त करने के लिए, आपको एक लूप लिखना होगा और इसके बजाय RegExp.exec() का उपयोग करना होगा (जो आपको एक समय में एक मैच देता है, लेकिन इसके सभी कैप्चर)।

और PHP के साथ क्या है? ऐसा लगता है कि यह preg_match_all का उपयोग कर रहा है, जो कि वैसे भी वैश्विक है, यही कारण है कि g का कोई प्रभाव नहीं पड़ा। + परिणाम देता है जिसे आप फिर से उम्मीद करेंगे। तो {5} करता है।

अन्य दो के साथ क्या है? यहां, आउटपुट को गलत तरीके से समझा गया है। डिफ़ॉल्ट रूप से, preg_match_all एक दो आयामी सरणी देता है, जहां पहली अनुक्रमणिका समूह से मेल खाती है, और दूसरा मैच से मेल खाता है। आपके आउटपुट में, यह दूसरे तरीके से व्याख्या की गई है। इसलिए, जब कई मैचों होते हैं, तो 0 और 1 की पहली जोड़ी दो मिले मैचों का पूरा मिलान है। दूसरी जोड़ी 0 और 1 जो आपने उन दो मैचों में कब्जा कर लिया है।

तो * के लिए, आपको पहले मैच के रूप में पूर्ण स्ट्रिंग मिलती है, और कैप्चर के रूप में अंतिम वर्ण (0 लेबल वाली दो चीजें), जो सही है। और फिर, * शून्य-चौड़ाई वाले मैचों की अनुमति देता है, इसलिए आपको खाली कैप्चर के साथ स्ट्रिंग के अंत में एक और (खाली) मैच मिलता है।मुझे यकीन नहीं है कि संबंधित JS' उदाहरण में अतिरिक्त खाली स्ट्रिंग क्यों नहीं है, क्योंकि String.match वही काम करेगा।

और {4} के लिए, तो आप सिर्फ कैप्चर l और !, क्रमशः, जो फिर से बिल्कुल ठीक है के साथ जावास्क्रिप्ट मामले में दो मैच (Trol और olo!) मिलता है।

+0

> सबसे पहले, क्या होना चाहिए? बिल्कुल, यह सवाल है :-) मुझे वास्तव में उम्मीद थी कि एबीसीडी पर मिलान (।) * 0 एबीसीडी 1. ए 2. बी 3. सी 4. डी - यानी, मुझे और समूह मिलेंगे, क्योंकि क्वांटिफायर समूह को मापने लगता है। लेकिन इसके बारे में लंबे समय तक सोचना, ऐसा लगता है कि समूह संदर्भ ठीक नहीं हैं। – Falko

+1

@ फाल्को, एकमात्र रेगेक्स स्वाद जो कि .NET है। वहां आपको प्रत्येक समूह के लिए समूह ऑब्जेक्ट मिलता है जिसमें कैप्चर का संग्रह होता है। –

+0

आह, ठंडा। लेकिन जैसा कि बताया गया है, मैं कल्पना नहीं कर सकता कि यह अभ्यास में कैसे सहायक हो सकता है। – Falko

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