मैं सफेद स्थान या अल्पविराम द्वारा जावास्क्रिप्ट स्ट्रिंग कैसे विभाजित कर सकता हूं?


123

अगर मैं कोशिश करूँ

"my, tags are, in here".split(" ,")

मुझे निम्नलिखित मिला है

[ 'my, tags are, in here' ]

जबकि मैं चाहता हूं

['my', 'tags', 'are', 'in', 'here']

4
क्या आपके पास व्हाट्सएप या अल्पविराम का मतलब नहीं है ?
KaptajnKold 7

1
परिणाम के लिए एक स्पष्टीकरण के रूप में जो आपको मिल रहा है: "my, tags are, in here".split(" ,")स्ट्रिंग को केवल उसी स्थान पर विभाजित किया जाएगा जहां अल्पविराम के बाद एक स्थान विभाजक है। आपकी स्ट्रिंग में वह क्रम नहीं है, इसलिए इसे विभाजित नहीं किया गया है। "my, tags are, in here".split(", ")बंटवारे के अनुक्रम के साथ, प्रत्येक कॉमा-एंड-स्पेस के बाद, आपके मूल स्ट्रिंग को कम से कम तीन भागों में विभाजित किया जाएगा। यदि आप पांच भाग चाहते हैं, तो नीचे दिए गए उत्तर मैच स्ट्रिंग को एक स्पेस या कॉमा से मेल खाते हुए एक नियमित अभिव्यक्ति के रूप में निर्दिष्ट करते हैं ।
जोकेम शुल्नेक्लोपर 20'16

जवाबों:


233

String.split एक नियमित अभिव्यक्ति भी स्वीकार कर सकते हैं:

input.split(/[ ,]+/);

यह विशेष रूप से रेगेक्स एक या एक से अधिक अल्पविराम या रिक्त स्थान के अनुक्रम पर विभाजित होता है, ताकि उदाहरण के लिए कई लगातार रिक्त स्थान या अल्पविराम + स्थान अनुक्रम परिणामों में रिक्त तत्व उत्पन्न न करें।


22
किस बारे में /,?\s+/?
बर्गी

4
@Bergi: ठीक है, यह दोनों मेरे सुझाव से ज्यादा सख्त है (केवल एक अल्पविराम की अनुमति देता है, सामने वाला) और ओपी ने जो पूछा है, उससे अधिक ढीला (सभी व्हाट्सएप पर विभाजित)। IMHO यह केवल बदतर होगा - इनपुट पर विचार करें spaces , before commas
जॉन

@ जॉन: ठीक है, यह ओप्स की जरूरतों पर निर्भर करता है। मैं plenk नहीं होता :-)
Bergi

11
+1 मैं जानता हूं कि यह थोड़ा पुराना है लेकिन खाली जगह का उपयोग क्यों करें और नहीं \s। मैं बूँद में कुछ लाइन टूट सकता है और \sउन का भी ख्याल रखता है।

6
FACEPALM नोट: regex के आस-पास उद्धरण न रखें। उदा input.split("/[ ,]+/)"। उपयोग न करें । उद्धरण छोड़ें ( input.split(//)इसके बजाय input.split("//")) और आपके पास बेहतर अनुभव होगा। क्योंकि अजीब तरह से, यह वास्तव में केवल स्वयं (उत्पन्न करने के लिए ["input.split(\"", ")\""]) पर काम करेगा ।
cod3monk3y

41

उपयोग करने का सुझाव .split(/[ ,]+/)अच्छा है, लेकिन जल्द ही या बाद में प्राकृतिक वाक्यों के साथ आप सरणी में खाली तत्व प्राप्त करेंगे। उदा ['foo', '', 'bar']

जो ठीक है अगर आपके उपयोग के मामले में ठीक है। लेकिन अगर आप खाली तत्वों से छुटकारा पाना चाहते हैं तो आप कर सकते हैं:

var str = 'whatever your text is...';
str.split(/[ ,]+/).filter(Boolean);

6
देसी वस्तु का एक बहुत ही चतुर उपयोग निहित निर्माण निर्माता- मेरा कंप्यूटर कीबोर्ड आज सुबह पागल है - मैं इस टिप्पणी को बाद में संपादित करूंगा- लेकिन बिंदु 'बूलियन ()' की तरह बूलियन का आह्वान कर रहा है। झूठ का मूल्य, बस 'नए बुलियन ()' को लागू करने के रूप में। जो कि इस डिफ़ॉल्ट व्यवहार के सभी मैचों को फ़िल्टर कर देगा। एक अच्छा :)
वीएलओस्टबॉय

"प्राकृतिक वाक्यों" से आपका क्या तात्पर्य है? मैं इसका अनुकरण नहीं कर सका और न ही मुझे समझ में आया कि यह क्या करना चाहिए।
क्रेगॉक्स

यह @VLostBoy द्वारा समझाया गया है। जब Boolean()कंस्ट्रक्टर को किसी भी मूल्य पर बुलाया जाता है, तो वह उस मूल्य को एक बूलियन में डालता है - सच या गलत। इस प्रकार, किसी भी मिथ्या मान को खाली स्ट्रिंग सहित सरणी से फ़िल्टर किया जाएगा।
jonschlinkert

1
btw, आप अन्य समान मज़ेदार सामानों के लिए निहित निर्माणकर्ताओं का उपयोग कर सकते हैं, जैसे[1, 2, 3].map(String)
jonschlinkert

2
"foo, bar,,foobar,".split(/[\s,]+/)रिटर्न ["foo", "bar", "foobar", ""](अंत में लटकते अल्पविराम के कारण), धन्यवाद!
राफेल सिलेक

37

सफ़ेद स्थान की किसी भी लम्बाई को पकड़ने के लिए आप रेगेक्स का उपयोग कर सकते हैं, और यह इस तरह होगा:

var text = "hoi how     are          you";
var arr = text.split(/\s+/);

console.log(arr) // will result : ["hoi", "how", "are", "you"]

console.log(arr[2]) // will result : "are" 

उपयोग करते समय प्रमुख / अनुगामी व्हाट्सएप से सावधान रहें /\s+/। उदाहरण के लिए, 'a b c '.split(/\s+/) === [ 'a', 'b', 'c', '' ]। अगर तुम.trim() पहले स्ट्रिंग करते हैं, तो आप अच्छे होंगे।
जॉर्डन डोडसन

12
"my, tags are, in here".split(/[ ,]+/)

परिणाम है :

["my", "tags", "are", "in", "here"]

4

input.split(/\s*[\s,]\s*/)

... \s* शून्य या अधिक श्वेत अंतरिक्ष वर्णों से मेल खाता है (न केवल रिक्त स्थान, बल्कि टैब और न्यूलाइन्स भी)।

... [\s,] एक सफेद अंतरिक्ष चरित्र या एक अल्पविराम से मेल खाता है

यदि आप रिक्त तत्वों से इनपुट से बचना चाहते हैं "foo,bar,,foobar", तो यह चाल चलेगा:

input.split(/(\s*,?\s*)+/)

+एक या पूर्ववर्ती चरित्र या समूह के और अधिक मेल खाता है।

संपादित करें:

?कॉमा के बाद जोड़ा गया जो शून्य या एक कॉमा से मेल खाता है।

2 संपादित करें:

1 संपादित करना एक गलती थी। ठीक कर दिया। अब मैच खोजने के लिए अभिव्यक्ति के लिए कम से कम एक अल्पविराम या एक स्थान होना चाहिए।


Nop। यह अच्छा नहीं है। यह आउटपुट है: ["मेरे", "टैग हैं", "यहाँ" में]
gabitzish

यह प्रत्येक वर्ण पर विभाजित होने लगता है।
मार्को

@ मार्को उफ़। संभवतः इससे पहले कि मैं अंतिम संपादन करता हूं, इसका परीक्षण करना चाहिए था। मेरे पास अब है, और इस समय यह वास्तव में काम करना चाहिए।
KaptajnKold

हम्म, यह स्वीकृत उत्तर से बेहतर कैसे है? साथ ही "foo,bar,foobar".split(/[ ,]+/)लौटता है ["foo", "bar", "foobar"]
राफेल सिलेक

1
@KaptajnKold ओह, मैं यह नहीं पकड़ पाया, जवाब देने के लिए धन्यवाद!
राफेल सिलेक

2

जब मैं आपके अल्पविराम (मेरे मामले में प्रत्येक टोकन उद्धरण के साथ दर्ज किया जा सकता है) जैसे अतिरिक्त वर्णों को ध्यान में रखना चाहता हूं, तो मैं अन्य delimiters को रिक्त स्थान में बदलने और फिर व्हाट्सएप पर विभाजित करने के लिए एक string.replace () करूँगा।


1
str_variable.replace(/[,'"]+/gi, ' ').split(' ')
qräbnö
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.