2010-05-20 21 views
62

मैं केवल एक बार एक स्ट्रिंग कैसे विभाजित कर सकता हूं, यानी 1|Ceci n'est pas une pipe: | Oui पार्स: ["1", "Ceci n'est pas une pipe: | Oui"] पर?जावास्क्रिप्ट में एक बार स्ट्रिंग स्ट्रिंग?

विभाजन में सीमा मदद करने के लिए प्रतीत नहीं होता ...

उत्तर

64

यह एक सुंदर दृष्टिकोण नहीं है, लेकिन सभ्य दक्षता के साथ काम करता है:

var string = "1|Ceci n'est pas une pipe: | Oui"; 
var components = string.split('|'); 
alert([components.shift(), components.join('|')]​);​​​​​ 

Here's a quick demo of it

+0

यह वास्तव में रेगेक्स से बेहतर है, मुझे लगता है। सही के रूप में चुना गया, धन्यवाद! –

+2

स्पष्टीकरण के लिए, वह एन भागों में विभाजित हो रहा है और फिर पहले सूची को एक सूची में पॉप कर रहा है और बाकी को उसी सूची में शामिल कर रहा है। –

+0

यदि आप 1 के बजाय स्ट्रिंग से के टोकन प्राप्त करना चाहते हैं, तो घटकों के बजाय उपयोग घटकों.splice (0, k) को छोड़कर उपर्युक्त जैसा ही करें। शिफ़्ट()। –

12

आप उपयोग कर सकते हैं:

var splits = str.match(/([^|]*)\|(.*)/); 
splits.shift(); 

regex स्ट्रिंग विभाजन दो मेल खाने वाले समूह (parenthesized), पाठ पहले पूर्ववर्ती में | और बाद में पाठ। फिर, हम पूरे स्ट्रिंग मैच (splits[0]) से छुटकारा पाने के लिए shift परिणाम प्राप्त करते हैं।

+1

इस कोड और कार्यों का परीक्षण किया। Regex का उपयोग करने के लिए 1+। – Riley

+0

ठीक से, जो शायद शुरुआत में एंकर होना चाहिए। हालांकि जावास्क्रिप्ट regexen लालची प्रतीत होता है। – muhmuhten

+0

आह, इसके लिए धन्यवाद, यह काम करना चाहिए! –

3

इस प्रयास करें:

function splitOnce(input, splitBy) { 
    var fullSplit = input.split(splitBy); 
    var retVal = []; 
    retVal.push(fullSplit.shift()); 
    retVal.push(fullSplit.join(splitBy)); 
    return retVal; 
} 

var whatever = splitOnce("1|Ceci n'est pas une pipe: | Oui", '|'); 
0

जावास्क्रिप्ट नियमित अभिव्यक्ति कार्यक्षमता का उपयोग और पहले ले कब्जा अभिव्यक्ति।

आरई शायद /^([^|]*)\|/ जैसा दिखता है।

असल में, आपको केवल /[^|]*/ की आवश्यकता है यदि आपने सत्यापित किया है कि स्ट्रिंग को इस तरह से स्वरूपित किया गया है, जावास्क्रिप्ट रेगेक्स लालची के कारण।

88

आप '|' की पहली घटना के सूचकांक प्राप्त करने के लिए String.indexOf('|') का उपयोग करना चाहते हैं।

var i = s.indexOf('|'); 
var splits = [s.slice(0,i), s.slice(i+1)]; 
+0

यह भी एक अच्छा समाधान है। –

+12

निक के रूप में "मजेदार" नहीं है, लेकिन शायद अधिक कुशल है। यह भी ध्यान दें कि एक से अधिक वर्णों में '+ 1' वास्तव में विभाजक स्ट्रिंग की लंबाई होनी चाहिए। – devios1

+0

यह समाधान कम "मजेदार" क्यों है? – Bentley4

1

बस जवाब में से अधिकांश के रूप में बुराई अब तक के रूप में:

var splits = str.split('|'); 
splits.splice(1, splits.length - 1, splits.slice(1).join('|')); 
0

एक वैकल्पिक, लघु दृष्टिकोण, कहीं और माल लोगों के अलावा, अपने लाभ के लिए उपयोग करने के लिए replace() की सीमा नहीं है।

var str = "1|Ceci n'est pas une pipe: | Oui"; 
str.replace("|", "aUniquePhraseToSaySplitMe").split("aUniquePhraseToSaySplitMe"); 

@sreservoir टिप्पणी में बताते हैं के रूप में, अद्वितीय वाक्यांश सही मायने में अनूठा होना चाहिए - यह स्रोत में नहीं हो सकता तुम पर इस विभाजन चला रहे हैं, या आप अधिक टुकड़ों में स्ट्रिंग विभाजन मिलेगा आप चाहते हैं की तुलना में। जैसा कि वह कहता है, एक अनपेक्षित चरित्र, यदि आप उपयोगकर्ता इनपुट के खिलाफ इसे चला रहे हैं (यानी, ब्राउज़र में टाइप किया गया हो)।

+0

जो केवल 'अद्वितीय' वाक्यांश निर्विवाद है तो केवल तभी काम करता है। यदि एक पाठ फ़ाइल से पढ़ना, यह असंभव है। यदि ब्राउजर से पढ़ना है, तो शायद कोई जुर्माना नियंत्रण चरित्र अगर ठीक है। टैब भी अद्भुत काम करता है। किसी भी मामले में, "aUniquePhraseToSaySplitMe" लगभग निश्चित रूप से इनपुट का हिस्सा है, और इस प्रकार खतरनाक है। – muhmuhten

+0

आप निश्चित रूप से सही हैं। मेरा उदाहरण संक्षेप में क्या किया जा रहा है यह समझाते हुए एक आंख के साथ एक उदाहरण है। मैं आपके बिंदु को उत्तर में ही शामिल करूंगा। धन्यवाद! –

+0

यदि आप अपने अद्वितीय वाक्यांश के लिए str का उपयोग करते हैं, तो आप जानते हैं कि यह वहां फिर से नहीं हो सकता है! : बुराई grin –

7

एक लाइनर और imo, सरल:

var str = 'I | am super | cool | yea!'; 
str.split('|').slice(1).join('|'); 

यह रिटर्न "कर रहा हूँ सुपर | शांत | हाँ!"

+0

यह नहीं पूछा गया था कि वे पहले भाग में लापता होने की तलाश में हैं। – SmujMaiku

3

यदि स्ट्रिंग में डिलीमीटर नहीं है तो @ निकक्रैवर का समाधान दो तत्वों की एक सरणी वापस कर देगा, दूसरा खाली स्ट्रिंग होगा। मैं विभाजन के मिलान के व्यवहार को पसंद करता हूं। यही है, अगर इनपुट स्ट्रिंग में डिलिमिटर नहीं होता है तो केवल एक तत्व के साथ एक सरणी होती है।

var splitOnce = function(str, delim) { 
    var components = str.split(delim); 
    var result = [components.shift()]; 
    if(components.length) { 
     result.push(components.join(delim)); 
    } 
    return result; 
}; 

splitOnce("a b c d", " "); // ["a", "b c d"] 
splitOnce("a", " "); // ["a"] 
0

यह एक थोड़ी देर है, लेकिन यह काम करता है जैसे मेरा मानना ​​है कि सीमा को:

function split_limit(inString, separator, limit){ 
    var ary = inString.split(separator); 
    var aryOut = ary.slice(0, limit - 1); 
    if(ary[limit - 1]){ 
     aryOut.push(ary.slice(limit - 1).join(separator)); 
    } 
    return aryOut; 
} 
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 1)); 
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 2)); 
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 3)); 
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 7)); 

https://jsfiddle.net/2gyxuo2j/

शून्य की सीमा अजीब परिणाम देता है, लेकिन क्षमता के नाम पर, मैं चला गया इसके लिए चेक आउट करें। यदि आपको इसकी आवश्यकता हो तो आप इसे फ़ंक्शन की पहली पंक्ति के रूप में जोड़ सकते हैं:

if(limit < 1) return []; 
संबंधित मुद्दे