तो, यहाँ मैं क्या करने की कोशिश कर रहा हूँ, हालाँकि मैं कुछ समय से इससे जूझ रहा हूँ।
मान लें कि हमारे पास यह इनपुट है:
{{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"]]
फिर मैंने इसे इस तरह करने की कोशिश की (यहां स्क्रिप्ट देखें):
\{\{(([^\|\{\}]+)\|?)+\}\}
लेकिन मैं कुछ गलत कर रहा होगा।
किसी भी तरह की सहायता को आभार समझेंगे! :)
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
जोड़ें। या, बेहतर दक्षता के लिए पैटर्न को अनियंत्रित करें: /{{[^}]*(?:}(?!})[^}]*)*}}/
(देखें रूबलर डेमो)।
.scan(/{{(.*?)}}/).flatten.map{ |x| x.split("|") }
काम करने लगता है।