क्या / \ / s / g और / \ s + / g के बीच अंतर है?


87

जब हमारे पास एक स्ट्रिंग होती है जिसमें अंतरिक्ष वर्ण होते हैं:

var str = '  A B  C   D EF ';

और हम स्ट्रिंग से रिक्त स्थान को निकालना चाहते हैं (हम यह चाहते हैं:) 'ABCDEF'

यह दोनों:

str.replace(/\s/g, '')

और इस:

str.replace(/\s+/g, '')

सही परिणाम लौटाएगा।

क्या इसका मतलब यह है कि +इस स्थिति में ज़रूरत से ज़्यादा है? क्या इस स्थिति में उन दो नियमित अभिव्यक्तियों के बीच अंतर है (जैसे कि, वे किसी भी तरह से अलग परिणाम उत्पन्न कर सकते हैं)?


अपडेट: प्रदर्शन तुलना - /\s+/gतेज है। यहां देखें: http://jsperf.com/s-vs-s


1
vidas stackoverflow.com/questions/5963182/… मुझे यकीन है कि यह वही है जो आपने यह सवाल पूछा है;) (जवाब पर आपकी टिप्पणी)
rsplak

2
मैं कल्पना कर सकता हूं कि \s+यह तेजी से हो, क्योंकि यह व्हाट्सएप की जगह ले सकता है, जबकि \sप्रत्येक सफेद स्थान को अलग से बदलना होगा?
KooiInc

1
@KooiInc: सही है, क्योंकि यह कम समय में मेल खाता है / बदलता है।
BoltClock

जवाबों:


214

पहले रेगेक्स में, प्रत्येक अंतरिक्ष चरित्र को चरित्र द्वारा प्रतिस्थापित किया जा रहा है, खाली स्ट्रिंग के साथ।

दूसरे रेगेक्स में, रिक्त स्थान के प्रत्येक सन्निहित स्ट्रिंग को रिक्त स्ट्रिंग के साथ प्रतिस्थापित किया जा रहा है+

हालाँकि, जैसे 0 को किसी और चीज़ से 0 गुणा किया जाता है, ऐसा लगता है जैसे दोनों विधियाँ बिल्कुल उसी तरह से स्पेस बनाती हैं।

यदि आप प्रतिस्थापन स्ट्रिंग को बदलते हैं '#', तो अंतर बहुत स्पष्ट हो जाता है:

var str = '  A B  C   D EF ';
console.log(str.replace(/\s/g, '#'));  // ##A#B##C###D#EF#
console.log(str.replace(/\s+/g, '#')); // #A#B#C#D#EF#

27

\s"एक स्थान" का \s+अर्थ है , और "एक या अधिक स्थान" का अर्थ है।

लेकिन, क्योंकि आप /gध्वज का उपयोग कर रहे हैं (सभी घटनाओं को प्रतिस्थापित करें) और खाली स्ट्रिंग के साथ प्रतिस्थापित करने से आपके दो भावों पर समान प्रभाव पड़ता है।


लेकिन दूसरा संस्करण शायद तेज होगा।
टिम पीटरज़

मैं / जी उपयोग करने के लिए अगर मैं \ s + उपयोग कर रहा हूँ की जरूरत नहीं है तो इसका मतलब होता है,
गौरव

1
@ गौरव: नहीं। क्योंकि तब यह केवल पहले की जगह लेगा \s+, बाकी को बरकरार रखा जाएगा। उदाहरण के लिए, ' foo bar '.replace(/\s+/, '')आप केवल देना होगा 'foo bar ' संपादित अरे एचटीएमएल एक में दो रिक्त स्थान संघनक
BoltClock

@ गौरव मुझे ऐसा नहीं लगता। यदि आप gसंशोधक को छोड़ देते हैं , तो व्हाट्सएप के ब्लॉक की पहली घटना को बदल दिया जाएगा।
KooiInc

10

एक मैच की स्थिति में पहला व्हाट्सएप प्रति एक मैच लौटाएगा, जब दूसरा व्हाट्सएप के प्रत्येक समूह के लिए एक मैच लौटाएगा।

परिणाम समान है क्योंकि आप इसे एक खाली स्ट्रिंग के साथ बदल रहे हैं। यदि आप उदाहरण के लिए इसे 'x' से बदलते हैं, तो परिणाम भिन्न होंगे।

str.replace(/\s/g, '') 'xxAxBxxCxxxDxEF' लौटाएगा

जबकि str.replace(/\s+/g, '') 'xAxBxCxDxEF' वापस आएगा

क्योंकि \sप्रत्येक व्हाट्सएप से मेल खाता है, प्रत्येक को 'x' से बदल रहा है, और \s+व्हॉट्सएप के समूहों को मिलाता है, एक 'x' के साथ कई अनुक्रमिक व्हाट्सएप की जगह लेता है।


3

+"एक या अधिक वर्ण" और प्लस के बिना इसका अर्थ है "एक वर्ण।" आपके मामले में दोनों का परिणाम एक ही है।

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