',' द्वारा वाक्यों को विभाजित करें और आसपास के रिक्त स्थान को हटा दें


84

मेरे पास यह कोड है:

var r = /(?:^\s*([^\s]*)\s*)(?:,\s*([^\s]*)\s*){0,}$/
var s = "   a   ,  b  , c "
var m = s.match(r)
m => ["   a   ,  b  , c ", "a", "c"]

लगता है कि पूरे तार का मिलान हो गया है, लेकिन कहां "b"गया है? मैं बल्कि पाने की उम्मीद करूंगा:

["   a   ,  b  , c ", "a", "b", "c"]

इतना है कि मैं m.shift()एक परिणाम के साथ कर सकते हैं , s.split(',')लेकिन साथ ही हटाए गए व्हाट्सएप के साथ भी।

क्या मुझे rexxp में कोई गलती है या क्या मुझे गलतफहमी है String.prototype.match?


साइड नोट के रूप में, के {0,}रूप में ही है *
pimvdb

खैर, sयह भी हो सकता है ' a, c'या'a,b,c d e, f'
बजे

मैं करने के लिए \ रों रिक्त स्थान बदल देंगे
meandre

जवाबों:


194

यहां एक जटिल नियमित अभिव्यक्ति की आवश्यकता के बिना ऐसा करने का एक बहुत सरल और सीधा तरीका है।

var str = "   a   ,  b  , c "
var arr = str.split(",").map(function(item) {
  return item.trim();
});
//arr = ["a", "b", "c"]

मूल निवासी .mapIE9 और ऊपर: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map पर समर्थित है


या ES6 + में यह और भी छोटा हो जाता है:

var arr = str.split(",").map(item => item.trim());

और पूरा करने के लिए, यहां टाइपिंग जानकारी के साथ टाइपस्क्रिप्ट में है

var arr: string[] = str.split(",").map((item: string) => item.trim());

4
बस picky होने के लिए, आप नक्शे तर्क के आसपास ब्रेसिज़ के साथ दूर कर सकते हैं: var arr = str.split(",").map(item=>item.trim());
डेविड जोन्स

मैं इस पर @DavidJones के साथ हूं। यदि आप संशोधित करते हैं तो आपका उत्तर बहुत अच्छा होगा। मेरे मामले के लिए मेरी बहुत मदद की, धन्यवाद दोस्तों!
22-22

हां अच्छा बिंदु - उत्तर प्रतिबिंबित करने के लिए अद्यतन! मैं व्यक्तिगत रूप से हमेशा कोष्ठक जोड़ता हूं, क्योंकि मैं आमतौर पर टाइपस्क्रिप्ट लिख रहा हूं, और मुझे स्पष्ट प्रकार की जानकारी प्रदान करना पसंद है ताकि आप हमेशा जान सकें कि एक नज़र में क्या कुछ है।
CBarr

यह एक शानदार जवाब है क्रिस।
चक्रीय

सरल और सबसे अच्छा !!
राहुल सोनवंशी


17

संक्षिप्त उत्तर: उपयोग करें m = s.match(/[^ ,]/g);


आपका आरई अपेक्षा के अनुरूप काम नहीं करता है, क्योंकि अंतिम समूह सबसे हालिया मैच (= c) से मेल खाता है । यदि आप छोड़ देते हैं {1,}$, तो लौटा हुआ मैच होगा " a , b ", "a", "b"। संक्षेप में, जब तक आप globalध्वज का उपयोग नहीं करते तब तक आपका RegExp निर्दिष्ट समूहों के रूप में अधिक से अधिक मिलान करता है /g। इस मामले में, लौटी सूची सभी मिलान किए गए सबस्ट्रिंग के संदर्भ रखती है।

अपना प्रभाव प्राप्त करने के लिए, उपयोग करें:

m = s.replace(/\s*(,|^|$)\s*/g, "$1");

यह हर अल्पविराम ( ,), शुरुआत ( ^) और अंत ( $), व्हाट्सएप से घिरा हुआ है, मूल चरित्र ( comma, या कुछ नहीं) द्वारा प्रतिस्थापित करता है ।

यदि आप एक सरणी प्राप्त करना चाहते हैं, तो उपयोग करें:

m = s.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/);

यह आरई स्ट्रिंग को ट्रिम कर देता है (शुरुआत और अंत में सभी व्हाट्सएप को हटा देता है, फिर स्ट्रिंग को विभाजित करता है <any whitespace>,<any whitespace>। ध्यान दें कि सफेद-अंतरिक्ष वर्णों में नई वर्णमालाएं और टैब भी शामिल हैं। यदि आप रिक्त स्थान पर चिपके रहना चाहते हैं, तो इसके बजाय एक स्थान ( ) का उपयोग करें ) \s


@ और मैंने आपके आरई के स्पष्टीकरण का विस्तार किया है। एक उदाहरण के लिए मेरा दूसरा उदाहरण देखेंsplit विधि के ।
रॉब डब्ल्यू

मैंने पहले ही इसे एक उत्तर के रूप में एक टिप्पणी के रूप में पोस्ट कर दिया है। मुझे आश्चर्य है, क्या मैं इसे एक regexp के साथ कर सकता हूं और एक ऑपरेशन या js regexp पर्याप्त स्मार्ट नहीं है?
मेन्ड्रे

@ और हां, बस उपयोग करें s.match(/[^ ,]+/g)। जैसा कि मेरे उत्तर के शीर्ष पर उल्लिखित /gहै, वैश्विक ध्वज है, जो सभी मिलान वाले पदार्थों को लौटाता है।
रॉब डब्ल्यू

@ भारत: एक कैप्चरिंग ग्रुप एक मैच बनाता है, चाहे आप कितनी भी मात्रा में जोड़ लें। यदि आप मेल खाना चाहते हैं a, bऔर c, आपको तीन जोड़े कोष्ठक की आवश्यकता है (शामिल नहीं (?:...)):/(?:^\s*([^\s]*)\s*)(?:,\s*([^\s]*)\s*)(?:,\s*([^\s]*)\s*)$/
user123444555621

@ रॉब, s.match (/ [^,] + / g) ठीक वैसी ही काम करता है जैसी मुझे जरूरत है, कृपया इसे अपने उत्तर में जोड़ें
meandre


9

आप इसे अपने उद्देश्य के लिए कर सकते हैं
EDIT : टिप्पणियों में सुझाए अनुसार दूसरा प्रतिस्थापित करना। s.replace(/^\s*|\s*$/g,'').split(/\s*,\s*/)
पहले replaceस्ट्रिंग को ट्रिम करता है और फिर splitफ़ंक्शन को चारों ओर विभाजित करता है '\s*,\s*'। इससे ["a", "b", "c"]इनपुट पर आउटपुट मिलता है" a , b , c "

जैसे कि आपका रेगेक्स 'बी' पर कब्जा क्यों नहीं कर रहा है, आप एक कैप्चर किए गए समूह को दोहरा रहे हैं, इसलिए केवल अंतिम घटना पर कब्जा हो जाता है। उस पर और अधिक यहाँ http://www . अनियमित-expressions.info/captureall.html


मैं सभी
व्हाट्सएप

@ और सब व्हॉट्सएप नहीं है? या आपके पास ऐसे वाक्य हैं जिन्हें आप विभाजित करना चाहते हैं?
डेविड हेलसिंग

s.replace (/ ^ \ s * /, '') .replace (/ \ s * $ /, '') .Split (/ \ s *, \ s * /) ऐसा कर सकते हैं
meandre

@Andrew ने अपनी आवश्यकताओं के अनुसार उत्तर बदल दिया।
नरेन्द्र यदला

7

इसलिए अंत में मैं साथ गया /(?=\S)[^,]+?(?=\s*(,|$))/g, जो मुझे वही प्रदान करता है: आसपास के रिक्त स्थान के बिना ',' द्वारा विभाजित सभी वाक्य।

'       a,    OMG     abc b a b, d o WTF        foo     '.
  match( /(?=\S)[^,]+?(?=\s*(,|$))/g )
=> ["a", "OMG     abc b a b", "d o WTF        foo"]

बहुत धन्यवाद!


यहाँ इसका अर्थ है जैसे मैं इसे समझता हूं। कृपया मुझे सही करें अगर मैं सही नहीं हूँ: (?=\S)- केवल तभी कैप्चर करना शुरू करें जब सामने कोई व्हाट्सएप [^,]+न हो ?- जितना संभव हो उतना 'नहीं-अल्पविराम' पर कब्जा करें - लेकिन अगले समूह द्वारा कैप्चर किया जा सकता है पर कब्जा न करें (?=\s*(,|$))- इससे पहले सभी व्हाट्सएप को कैप्चर करें कॉमा या स्ट्रिंग का अंत /g- सभी स्ट्रिंग के माध्यम से दोहराएं
मेन्ड्रे

2

यदि आप नियमित अभिव्यक्ति का उपयोग करना चाहते हैं, तो कोड को सरल रखें और ES6 का उपयोग किए बिना:

s.replace(/ /g, '').split(",")

1 - रिक्त स्थान (/ ') द्वारा सभी रिक्त स्थान (/ / g) बदलें

2 - फिर इसे एक सरणी में विभाजित करें

वेटिला


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