जावास्क्रिप्ट में एक बार स्प्लिट स्ट्रिंग?


82

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

विभाजन की सीमा में मदद नहीं लगती ...

जवाबों:


79

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

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

यहाँ इसका एक त्वरित डेमो है


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

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

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

उन लोगों के लिए जो 2 या अधिक चक के साथ यह करना चाहते हैं, आप एक लूप में बदलाव का उपयोग कर सकते हैं या:components.splice(0,2).slice(0,2)
अल्टीमेटर

114

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

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

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

यह समाधान कम "मज़ेदार" क्यों है?
बेंटले 4

सोच रहे लोगों के लिए, 2 या अधिक चूजों के साथ ऐसा करने के लिए, आप एक लूप में indexOf का उपयोग कर सकते हैं या:var i = s.split('|',2).join('|').length;//2nd index var splits = [s.slice(0,i).split('|'), s.slice(i+1)];
Ultimater

6
जब इंडेक्सऑफ रिटर्न -1 (जैसे अगर var s = 'string' है तो यह ['strin', 'string']) को लौटाता है तो यह विभाजन की तरह काम नहीं करता है। आपको एक सशर्त लिखना होगा।
जेजे

14

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

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

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


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

6

एक लाइनर और इमो, सरल:

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

यह "मैं सुपर कूल हूँ। हाँ!"


4
यह वही नहीं है जिसके लिए कहा गया था, वे पहले भाग के लापता होने की भी तलाश कर रहे हैं।
स्मूजमाईकू 19

6

ES6 सिंटैक्स एक अलग दृष्टिकोण की अनुमति देता है:

function splitOnce(s, on) {
   [first, ...rest] = s.split(on)
   return [first, rest.length > 0? rest.join(on) : null]
}

जो |रिक्त स्ट्रिंग के बजाय नल द्वारा लौटने से स्ट्रिंग की स्थिति को संभालती है , जो अधिक स्पष्ट है।

splitOnce("1|Ceci n'est pas une pipe: | Oui", "|")
>>> ["1", "Ceci n'est pas une pipe: | Oui"]

splitOnce("Celui-ci n'a pas de pipe symbol!", "|")
>>> ["Celui-ci n'a pas de pipe symbol!", null]

पास डे पाइप? C'est null!

मैंने इस उत्तर को मुख्य रूप से जोड़ा ताकि मैं पाइप के प्रतीक पर एक वाक्य बना सकूं, लेकिन es6 सिंटैक्स को दिखाने के लिए भी - यह आश्चर्यजनक है कि कितने लोग अभी भी इसका उपयोग नहीं करते हैं ...


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", '|');

3

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

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"]

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 टिप्पणियों में बताती है, अद्वितीय वाक्यांश वास्तव में अद्वितीय होना चाहिए - यह उस स्रोत में नहीं हो सकता है जिसे आप इस विभाजन को चला रहे हैं, या आप जितना चाहें उससे अधिक टुकड़ों में स्ट्रिंग विभाजन प्राप्त करेंगे। एक अनुचित चरित्र, जैसा कि वह कहता है, यदि आप इसे उपयोगकर्ता इनपुट (यानी, एक ब्राउज़र में टाइप किया गया) के खिलाफ चला रहे हैं, तो कर सकते हैं।


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

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

यदि आप अपने अद्वितीय वाक्यांश के लिए str का उपयोग करते हैं, तो आप जानते हैं कि यह फिर से वहां नहीं हो सकता है! : दुष्ट मुस्कराहट
Fabio Beltramini

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 [];

0

यदि आप "पाइपलाइन" का उपयोग करना चाहते हैं, reduceतो आपका मित्र है

const separator = '|'
jsonNode.split(separator)
   .reduce((previous, current, index) =>
    {
        if (index < 2) previous.push(current)
        else previous[1] += `${separator}${current}`
        return previous
    }, [])
    .map((item: string) => (item.trim()))
    .filter((item: string) => (item != ''))


-1

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

आरई शायद की तरह दिखेगा /^([^|]*)\|/

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.