2013-04-16 9 views
12

में कैप्चरिंग समूहों की संख्या की गणना करने के लिए रेगेक्स मुझे एक रेगेक्स की आवश्यकता है जो मनमाने ढंग से regex (एक स्ट्रिंग के रूप में) की जांच करता है, कैप्चरिंग समूहों की संख्या लौटाता है। अब तक मेरे पास है ...रेगेक्स को रेगेक्स

arbitrary_regex.toString().match(/\((|[^?].*?)\)/g).length 

कौन सा कुछ मामलों में, के लिए काम करता है, जहां इस धारणा है कि किसी भी समूह को एक प्रश्न चिह्न के साथ शुरू होता, गैर कैप्चरिंग है। यह खाली समूहों की भी गणना करता है।

यह चरित्र वर्गों, या बच निकले ब्रैकेट, और संभवतः कुछ अन्य परिदृश्यों में शामिल ब्रैकेट के लिए काम नहीं करता है।

+6

एक रेगेक्स में एक रेगेक्स ... [यो डॉग] (http://memearchive.net/memerial.net/5615/yo-dawg-i-herd-you-like-regex.jpg) – Kninnug

उत्तर

19

अपने रेगुलर एक्सप्रेशन से संशोधित करें कि वह एक खाली स्ट्रिंग से मेल खाएगी कोई रिक्त स्ट्रिंग से मेल खाते हैं तो, और देखें कि यह कितने समूहों रिटर्न:

var num_groups = (new RegExp(regex.toString() + '|')).exec('').length - 1; 

उदाहरण: http://jsfiddle.net/EEn6G/

+0

शानदार सामान - मैंने कभी ऐसा करने का सोचा नहीं होगा! –

+0

+1 लवली विचार, एंड्रयू। अच्छा काम। :) – zx81

+0

कोई बता सकता है कि पाइप क्या खड़ा है? – Albin

1

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

ध्यान दें कि समूहों की संख्या रेगेक्स में गैर-शाब्दिक ( एस की संख्या है। हम जो रणनीति ले रहे हैं वह सभी सही ( से मेल खाने की बजाय है, हम पर उनके बीच की सभी गलत सामग्री पर विभाजित हैं।

re.toString().split(/(\(\?|\\\[|\[(?:\\\]|.)*?\]|\\\(|[^(])+/g).length - 1 

आप देख सकते हैं कि यह कैसे www.debuggex.com पर काम करता है।