2013-08-23 3 views
10

मैं इस सरल स्ट्रिंग है? :विभाजन का उपयोग कर 2 वर्णों के समूहों में एक स्ट्रिंग को विभाजित करें?</p> <p><code>"a1a2a3"</code></p> <p>कोई regex अभिव्यक्ति जो <code>split</code> कमांड के साथ इस्तेमाल किया जा सकता है, तो यह एक जोड़े के लिए स्ट्रिंग विभाजित कर देगा है:

["a1","a2","a3"]?

मैं इस की कोशिश की है:

"a1a2a3".split(/(?=..)/)

लेकिन यह रिटर्न ["a", "1", "a", "2", "a3"]

पी.एस.

मैं इसे Match के साथ कर सकता हूं लेकिन रेगेक्स अभिव्यक्ति के लिए मैं देख रहा हूं (यदि मौजूद है) जो split का उपयोग करने में मेरी सहायता कर सकता है।

+0

अक्षरों को हटाने के लिए एक विधि का उपयोग कर वर्ण बनाए रखने के लिए आपकी प्रेरणा क्या है? –

+0

यह कितना अधिक है? a1-A100 ... परे? ए 1-9, बी 1-9, आदि? – smerny

+0

मुझे लगता है कि मुझे कुछ महीने पहले विभाजन के साथ एक जवाब दिखाई दे रहा है, लेकिन मुझे यह नहीं मिला। –

उत्तर

9

split भी लंबाई स्ट्रिंग के लिए:

str.split(/(?=(?:..)*$)/) 

अजीब लंबाई स्ट्रिंग के लिए split, अंतिम प्रविष्टि एक चरित्र है:

str.split(/(?=(?:..)*.$)/) 

वे मूल रूप से आगे बढ़ रहे हैं जो जांचते हैं कि आगे वर्णों की संख्या विषम या यहां तक ​​कि है। यह इस तथ्य का लाभ उठाता है कि सभी विभाजन पदों पर आगे वर्णों की संख्या स्ट्रिंग की लंबाई के समान समानता है।

पैटर्न (यहां तक ​​कि संस्करण) में पैटर्न (?:..)*$ है, जो स्ट्रिंग $ स्ट्रिंग के अंत से पहले (?:..)* वर्णों की संख्या के लिए भी जांच करता है। (ध्यान दें कि गैर-कैप्चरिंग समूह (?:pattern) का उपयोग यहां किया जाता है, अन्यथा, समूह को कैप्चर करने से split परिणाम में अतिरिक्त प्रविष्टियां मिलेंगी)। इसी तरह के स्पष्टीकरण विषम संस्करण के लिए लागू होता है।

ध्यान दें कि .excludes several new line characters: \n, \r, \u2028 या \u2029। यह ऐसे पात्रों वाले स्ट्रिंग के लिए अप्रत्याशित परिणाम देगा। . को [\s\S] (या अन्य समकक्ष निर्माण) के साथ बदलें ताकि यह सभी मामलों के लिए काम कर सके।

+0

। यह 1 अभिव्यक्ति में असामान्य स्थिति को छोटा कर दिया जा सकता है ... 'str.length% 2 == 0? /../:/../ ' –

+1

+1 यह बहुत सुंदर है –

4

मैंने पहले ही चैट में इसका उत्तर दिया है। आपको वास्तव में String.prototype.match का उपयोग करना चाहिए।

विभाजन के साथ किया जा सकता है? तकनीकी रूप से, हाँ। आप इसे /(..)/ से विभाजित कर सकते हैं और फिर रिक्त तारों को फ़िल्टर कर सकते हैं।

"a1a2a3".split(/(..)/).filter(function(a){ 
    return a !== ''; 
}); 
+7

या '" a1a2a3 ".split (/(..)/) फ़िल्टर (बूलियन)' –

+3

@CrazyTrain नाइस! चलो एक बाइट काट लें और इसके बजाय स्ट्रिंग का उपयोग करें। '" a1a2a3 ".split (/(..)/) फ़िल्टर (स्ट्रिंग)' – nderscore

+0

@CrazyTrain ... यह क्यों काम करता है? –

2

मुझे यकीन नहीं है कि इनपुट स्ट्रिंग के सभी संभावित प्रारूप क्या हैं, लेकिन मुझे लगता है कि यह कुछ पत्रों के बाद कुछ पत्र है।

आप की कोशिश कर सकते यदि ऐसा है तो:

var str = 'abc123d56efg8t5' 
var res = str.split(/([a-z]+[0-9]+)/).filter(Boolean); 

उत्पादन:

["abc123", "d56", "efg8", "t5"] 
संबंधित मुद्दे

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