तो, यहाँ मैं क्या करने की कोशिश कर रहा हूँ, हालाँकि मैं कुछ समय से इससे जूझ रहा हूँ।

मान लें कि हमारे पास यह इनपुट है:

{{something|a}} text text {{another|one|with|more|items}}

मैं जो हासिल करने की कोशिश कर रहा हूं:

[
    ["something", "a"],
    ["another", "one", "with", "more", "items"]
]

आसान तरीका कुछ ऐसा होगा:

"{{something|a}} text text {{another|one|with|more|items}}".scan(/([^\|\{\}]+)/)

लेकिन यह पैदावार - काफी अनुमानित रूप से - एक ही सरणी में सभी परिणाम (यह भी ध्यान दें कि मैं परिणामों में नहीं चाहता "पाठ पाठ", केवल घुंघराले ब्रेसिज़ में आइटम):

[["something"], ["a"], [" text text "], ["another"], ["one"], ["with"], ["more"], ["items"]] 

फिर मैंने इसे इस तरह करने की कोशिश की (यहां स्क्रिप्ट देखें):

\{\{(([^\|\{\}]+)\|?)+\}\}

लेकिन मैं कुछ गलत कर रहा होगा।

किसी भी तरह की सहायता को आभार समझेंगे! :)

2
Dr.Kameleon 17 पद 2020, 12:08
1
आप रूबी में किसी समूह के सभी कैप्चर मान नहीं प्राप्त कर सकते हैं। पैटर्न में हमेशा उतने ही कैप्चर होते हैं जितने कैप्चरिंग समूह होते हैं। तो, यहां .scan(/{{(.*?)}}/).flatten.map{ |x| x.split("|") } काम करने लगता है
 – 
Wiktor Stribiżew
17 पद 2020, 12:14
इतना सरल और इतना सीधा। हालांकि मुझे इस तरह से संपर्क करना चाहिए था... बहुत बहुत धन्यवाद! (बस इसे एक उत्तर के रूप में पोस्ट करें और मैं इसे सहर्ष स्वीकार करूंगा :))
 – 
Dr.Kameleon
17 पद 2020, 12:16

1 उत्तर

सबसे बढ़िया उत्तर

आप रूबी में दोहराए गए कैप्चरिंग समूह के सभी कैप्चर किए गए मान प्राप्त नहीं कर सकते। पैटर्न में हमेशा उतने ही कैप्चर होते हैं जितने कैप्चरिंग समूह होते हैं।

इस प्रकार, अपेक्षित आउटपुट प्राप्त करने के लिए आपको कुछ और कोड फेंकने की आवश्यकता है:

s = '{{something|a}} text text {{another|one|with|more|items}}'
p s.scan(/{{(.*?)}}/).flatten.map{ |x| x.split("|") }
# => [["something", "a"], ["another", "one", "with", "more", "items"]]

रूबी डेमो देखें।

ध्यान दें कि {{(.*?)}} पैटर्न {{ सबस्ट्रिंग से मेल खाता है, फिर लाइन ब्रेक वर्णों के अलावा कोई भी शून्य या अधिक वर्ण जितना संभव हो उतना कम और फिर }}, फिर .flatten परिणाम को बदल देता है एक स्ट्रिंग सरणी, और फिर x.split("|") एक map कॉल के भीतर पाए गए कैप्चरिंग समूह मानों को | के साथ विभाजित करता है।

नोट: यदि {{ और }} के बीच में लाइन ब्रेक हो सकते हैं, तो /m संशोधक, /{{(.*?)}}/m जोड़ें। या, बेहतर दक्षता के लिए पैटर्न को अनियंत्रित करें: /{{[^}]*(?:}(?!})[^}]*)*}}/ (देखें रूबलर डेमो)।

3
Wiktor Stribiżew 17 पद 2020, 12:18
1
एक बार फिर धन्यवाद! बहुत बढ़िया जवाब :)
 – 
Dr.Kameleon
17 पद 2020, 12:49
1
@Dr.Kameleon बहुत अच्छे और स्पष्ट प्रश्न के लिए आप धन्यवाद। अगर आपको आश्चर्य है कि "पैटर्न को अनियंत्रित करें" से मेरा क्या मतलब है, तो कृपया अनरोल लूप, कब उपयोग करना है देखें।
 – 
Wiktor Stribiżew
17 पद 2020, 12:55