दिलचस्प पोस्ट
Xcode 5.1 – के लिए संकलित करने के लिए कोई आर्किटेक्चर (ONLY_ACTIVE_ARCH = हाँ, सक्रिय arch = x86_64, VALID_ARCHS = i386) जेएनआई को जेस्ट्रिंग को चार में बदलना * आधुनिक 1000000007 प्रश्नों में सहायता की आवश्यकता है सूची में यादृच्छिक वस्तु का उपयोग करें प्रतिक्रिया / जेएसएक्स गतिशील घटक नाम मैं एक संरचना द्वारा खपत बाइट्स की संख्या कैसे जांचूं? मैं कोड को किस विधानसभा का पथ प्राप्त कर सकता हूं? 3 जी बनाम एज को निर्धारित करना एकल-आवृत्ति अनुप्रयोग बनाने का सही तरीका क्या है? एक जावा फ़ाइल में आयात स्टेटमेंट का अर्थ सबलेट फिल्टर के साथ अनुरोध पैरामीटर संशोधित करें एकाधिक सीएसवी फ़ाइलों को पंडों में आयात करें और एक डेटाफ़्रेम में जोड़ दें 30 के संशोधन के बाद "<sdk> / extras / google / google_play_services / libproject" फ़ोल्डर अनुपलब्ध है सी # में संदर्भित XSD के विरुद्ध एक्सएमएल की पुष्टि करना AngularJS गतिशील प्रपत्र क्षेत्र सत्यापन

जावास्क्रिप्ट रेगेक्स में एक मनमानी समूहों की संख्या कैसे कैप्चर करें?

मुझे जावास्क्रिप्ट की इस पंक्ति की उम्मीद है:

"foo bar baz".match(/^(\s*\w+)+$/) 

जैसे कुछ वापस करने के लिए:

 ["foo bar baz", "foo", " bar", " baz"] 

लेकिन इसके बजाय यह केवल अंतिम कब्जा कर लिया मैच लौटाता है:

 ["foo bar baz", " baz"] 

क्या सभी कब्जा किए गए मैच पाने का कोई तरीका है?

वेब के समाधान से एकत्रित समाधान "जावास्क्रिप्ट रेगेक्स में एक मनमानी समूहों की संख्या कैसे कैप्चर करें?"

जब आप एक कैप्चरिंग समूह को दोहराते हैं, तो अधिकांश जायके में, केवल अंतिम कैप्चर रखा जाता है; किसी भी पिछले कैप्चर को अधिलेखित किया गया है। कुछ स्वाद में, जैसे एनएटी, आप सभी मध्यवर्ती कैप्चर प्राप्त कर सकते हैं, लेकिन यह जावास्क्रिप्ट के मामले में नहीं है।

यह जावास्क्रिप्ट में है, अगर आपके एन कैप्चरिंग समूह के साथ एक पैटर्न है, तो आप केवल प्रति मैच बिल्कुल एन स्ट्रिंग कैप्चर कर सकते हैं, भले ही उन कुछ समूहों को दोहराया गया हो।

तो आम तौर पर बोलते हुए, आपको क्या करने की आवश्यकता पर निर्भर करता है:

  • यदि यह एक विकल्प है, तो इसके बजाय सीमांकक पर विभाजित करें
  • मिलान /(pattern)+/ बजाय /(pattern)+/ , शायद मैच /pattern/g , संभवतः एक exec लूप में
    • ध्यान दें कि ये दोनों बिल्कुल बराबर नहीं हैं, लेकिन यह एक विकल्प हो सकता है
  • बहुस्तरीय मिलान करें:
    • एक मैच में दोहराए गए समूह को कैप्चर करें
    • फिर उस मैच को अलग करने के लिए एक और रेगेक्स चलाएं

संदर्भ

  • regular-expressions.info/ एक कैप्चरिंग ग्रुप को दोहराते हुए एक दोहराए गए ग्रुप को कैप्चर करते हुए
    • जावास्क्रिप्ट स्वाद नोट्स

उदाहरण

यहां <some;words;here> एक टेक्स्ट में, एक exec लूप का उपयोग करके, और उसके बाद बंटवारे का मिलान करने का एक उदाहरण है ; व्यक्तिगत शब्द प्राप्त करने के लिए ( ideone.com पर भी देखें ):

 var text = "a;b;<c;d;e;f>;g;h;i;<no no no>;j;k;<xx;yy;zz>"; var r = /<(\w+(;\w+)*)>/g; var match; while ((match = r.exec(text)) != null) { print(match[1].split(";")); } // c,d,e,f // xx,yy,zz 

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

  _2__ / \ <(\w+(;\w+)*)> \__________/ 1 

यह <word> , <word;another> , <word;another;please> , आदि। किसी भी संख्या में कब्जा करने के लिए समूह 2 को दोहराया जाता है, लेकिन यह केवल अंतिम कैप्चर रख सकता है। शब्दों की संपूर्ण सूची को समूह 1 द्वारा कब्जा कर लिया गया है; इस स्ट्रिंग को अर्धविराम सीमांकक पर split किया जाता है

संबंधित सवाल

  • आप एक जावास्क्रिप्ट regex में मिलान समूहों का उपयोग कैसे करते हैं?

इस बारे में कैसा है? "foo bar baz".match(/(\w+)+/g)

जब तक आप अपने स्ट्रिंग्स को बांटते हैं, तो आप उन्हें विभाजित कर सकते हैं, और फिर उनके साथ प्रारंभिक स्ट्रिंग वापस लौटने के लिए एक अधिक जटिल आवश्यकता नहीं है:

 var data = "foo bar baz"; var pieces = data.split(' '); pieces.unshift(data); 

'जी' का उपयोग करने का प्रयास करें:

 "foo bar baz".match(/\w+/g)