स्ट्रिंग की सभी घटनाओं को कैसे बदलें?


4375

मेरे पास यह स्ट्रिंग है:

"Test abc test test abc test test test abc test test abc"

करते हुए:

str = str.replace('abc', '');

abcऊपर स्ट्रिंग में केवल पहली घटना को हटाने के लिए लगता है ।

मैं इसकी सभी घटनाओं को कैसे बदल सकता हूं ?


5
जब abaआप के ababaसाथ होने वाली सभी घटनाओं की जगह लेते हैं ca, तो आप किस परिणाम की उम्मीद करते हैं? caba? abca? cca?
रीस्टोरियरपोस्ट

String.prototype.replaceAll()सफारी 13.1 में शिप किया गया है और अब फ़ायरफ़ॉक्स नाइटली और क्रोम देव और कैनरी में है और फ़ायरफ़ॉक्स 77 और क्रोम 85 में जहाज जाएगा। यह एमडीएन में अभी तक प्रलेखित नहीं है, लेकिन github.com/tc39/proposal-string-repliceall#high-level-api एक व्याख्याकार है: "अगर searchValue एक स्ट्रिंग है, तो searchValue की सभी घटनाओं को String.prototype.replaceAllबदल देता है (जैसे कि अगर एक वैश्विक और उचित रूप से बची हुई नियमित अभिव्यक्ति का उपयोग किया गया था)। यदि searchValue एक गैर वैश्विक रेगुलर एक्सप्रेशन है, एक अपवाद "फेंकता है.split(searchValue).join(replaceValue)String.prototype.replaceAll
sideshowbarker

जवाबों:


1604

नोट: प्रदर्शन महत्वपूर्ण कोड में इसका उपयोग न करें।

एक सरल शाब्दिक स्ट्रिंग के लिए नियमित अभिव्यक्ति के विकल्प के रूप में, आप उपयोग कर सकते हैं

str = "Test abc test test abc test...".split("abc").join("");

सामान्य पैटर्न है

str.split(search).join(replacement)

यह उपयोग करने replaceAllऔर एक नियमित अभिव्यक्ति की तुलना में कुछ मामलों में तेज हुआ करता था, लेकिन आधुनिक ब्राउज़रों में अब ऐसा नहीं लगता है।

बेंचमार्क: https://jsperf.com/replace-all-vs-split-join

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


147
इसने मुझे आश्चर्यचकित कर दिया, क्योंकि मैं उम्मीद करता हूं कि यह विधि अधिक वस्तुओं का आवंटन करेगी, अधिक कचरा पैदा करेगी, और इस तरह अधिक समय लेगी, लेकिन जब मैंने वास्तव में एक ब्राउज़र में परीक्षण किया तो यह विधि स्वीकृत प्रतिक्रिया की तुलना में लगभग 20% तेज थी। परिणाम निश्चित रूप से भिन्न हो सकते हैं।
MgSam

42
मैं खुद उत्सुक था, और इसे सेट किया: jsperf.com/replace-all-vs-split-join । ऐसा लगता है कि v8 अन्य जावास्क्रिप्ट इंजनों की तुलना में विभाजन को तोड़ने / जुड़ने में सिर्फ तेज पागल है।
फेबी

8
बहुत अच्छा - विशेष पात्रों में गुजरने पर आपको खराब RegExps की संभावना से भी बचाता है। मैं एक ऑब्जेक्ट प्रॉपर्टी में "इसे ढूंढें और इसे प्रतिस्थापित करें" के लिए एक सामान्य ध्वज में जोड़ रहा हूं, लेकिन अगर मुझे प्रतिस्थापित करने की आवश्यकता है तो चिंतित था। या "}" और भूल गया कि मैं 3 महीने बाद RegEx का उपयोग कर रहा था!
टोब्रियांड

9
और String.prototype के रूप में: String.prototype.replaceAll = function(f,r){return this.split(f).join(r);}। उपयोग: "My string".replaceAll('st', '');"माई रिंग" का निर्माण करता है
मैक्रोमैन

8
मुझे उत्पादन में इसका उपयोग न करने की चेतावनी का कोई कारण नहीं दिख रहा है। यह सिर्फ एक रेगेक्स से बचने के लिए अधिक हैक नहीं है क्योंकि आप कई घटनाओं को बदलना चाहते हैं, लेकिन पहली जगह में एक रेगेक्स की आवश्यकता नहीं है। बस इसे "हैक" नामक एक अच्छे replaceAllफ़ंक्शन में लपेटें , और यह कुछ और के समान पठनीय हो जाता है। चूंकि प्रदर्शन खराब नहीं है, इसलिए इस समाधान से बचने का कोई कारण नहीं है।
यूएन

4382
str = str.replace(/abc/g, '');

टिप्पणी के जवाब में:

var find = 'abc';
var re = new RegExp(find, 'g');

str = str.replace(re, '');

के जवाब में वोट दें क्लिक करें की टिप्पणी, आप इसे और भी अधिक आसान बनाने में कर सकते हैं:

function replaceAll(str, find, replace) {
  return str.replace(new RegExp(find, 'g'), replace);
}

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

function escapeRegExp(string) {
  return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}

तो replaceAll()फ़ंक्शन को सुरक्षित बनाने के लिए , इसे निम्नलिखित में संशोधित किया जा सकता है यदि आप भी शामिल हैं escapeRegExp:

function replaceAll(str, find, replace) {
  return str.replace(new RegExp(escapeRegExp(find), 'g'), replace);
}

4
नियमित अभिव्यक्तियाँ इस "बॉक्स से बाहर" को पूरा करने का एकमात्र तरीका है, अपने स्वयं के 'प्रतिस्थापन' पद्धति को लागू किए बिना। मैं केवल उनके उपयोग के लिए उनके उपयोग का सुझाव नहीं दे रहा हूं।
सीन ब्राइट

10
इस टिप्पणी से यह मेरा स्वयं का कार्य है: function replaceAll(find, replace,str) { var re = new RegExp(find, 'g'); str = str.replace(re, replace); return str; }
क्लिक करें जुलाब

47
replaceAllकार्यान्वयन के प्रमुख चेतावनी यह है कि यदि findमेटाचट्रैक्टर्स होते हैं तो यह काम नहीं करेगा ।
मार्टिन एंडर

1
@ सीन सही हो तुम। मैंने आपकी जावास्क्रिप्ट का उपयोग एक php कोड में किया था ताकि मुझे बचने के लिए एक अतिरिक्त बैकस्लैश जोड़ना पड़े। फिडल पर आपका कोड एकदम सही है। मुझे जाँच करनी चाहिए थी। माफी jsfiddle.net/7y19xyq8
ओनिमुषा


2437

संपूर्णता के लिए, मुझे यह सोचने के लिए मिला कि मुझे इसे करने के लिए किस विधि का उपयोग करना चाहिए। मूल रूप से इसे करने के दो तरीके हैं जैसा कि इस पृष्ठ पर अन्य उत्तरों द्वारा सुझाया गया है।

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


नियमित अभिव्यक्ति आधारित कार्यान्वयन

String.prototype.replaceAll = function(search, replacement) {
    var target = this;
    return target.replace(new RegExp(search, 'g'), replacement);
};

स्प्लिट और जॉइन (कार्यात्मक) कार्यान्वयन

String.prototype.replaceAll = function(search, replacement) {
    var target = this;
    return target.split(search).join(replacement);
};

दक्षता के संदर्भ में दृश्यों के पीछे नियमित अभिव्यक्ति कैसे काम करती है, इसके बारे में बहुत अधिक नहीं जानते हुए, मैं प्रदर्शन के बारे में सोचे बिना अतीत में विभाजन की ओर झुकाव और कार्यान्वयन में शामिल हो गया। जब मैंने आश्चर्यचकित किया कि कौन सा अधिक कुशल था, और किस मार्जिन से, मैंने इसका पता लगाने के लिए एक बहाने के रूप में उपयोग किया।

मेरे क्रोम विंडोज 8 मशीन पर, रेगुलर एक्सप्रेशन आधारित कार्यान्वयन सबसे तेज़ है , जिसमें स्प्लिट और जॉइनन 53% धीमा है । मेरे द्वारा इस्तेमाल किए गए लोरेम इप्सम इनपुट के लिए नियमित अभिव्यक्तियाँ दोगुनी होती हैं।

इस बेंचमार्क को एक दूसरे के खिलाफ इन दो कार्यान्वयन चलाने की जाँच करें ।


जैसा कि @ThomasLeduc और अन्य द्वारा नीचे टिप्पणी में कहा गया है, नियमित अभिव्यक्ति-आधारित कार्यान्वयन के साथ एक समस्या हो सकती है अगर searchकुछ वर्ण शामिल हैं जो नियमित अभिव्यक्तियों में विशेष वर्णों के रूप में आरक्षित हैं । कार्यान्वयन यह मानता है कि कॉलर पहले से स्ट्रिंग से बच जाएगा या केवल स्ट्रिंग को पास करेगा जो रेगुलर एक्सप्रेशंस (एमडीएन) में तालिका में पात्रों के बिना हैं ।

एमडीएन हमारे तार से बचने के लिए एक कार्यान्वयन भी प्रदान करता है। यह अच्छा होगा यदि इसे भी मानकीकृत किया जाए RegExp.escape(str), लेकिन अफसोस, इसका कोई अस्तित्व नहीं है:

function escapeRegExp(str) {
  return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
}

हम escapeRegExpअपने String.prototype.replaceAllकार्यान्वयन के भीतर कॉल कर सकते हैं , हालांकि, मुझे यकीन नहीं है कि यह प्रदर्शन को प्रभावित करेगा (संभावित रूप से उन तारों के लिए भी जहां भागने की आवश्यकता नहीं है, जैसे सभी अल्फ़ान्यूमेरिक स्ट्रिंग्स)।


8
एंड्रॉइड 4.1 पर रेगेक्सप विधि 15% तेज है, लेकिन आप खोज करने के लिए अभिव्यक्ति से बच नहीं रहे हैं, इसलिए यह बेंचमार्क अधूरा है।
andreszs

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

2
पहला व्यक्ति ऐसा करेगा: 'bla.bla'.replaceAll ('। ',' _ '); "_______"। दूसरा एक 'bla_bla' करेगा, जो आम तौर पर आप क्या करना चाहते हैं।
RobKohr

1
@ThomasLeduc ऐसा लगता है कि आपके द्वारा बताए गए मुद्दे पर लॉश => लॉश एड
मैथ्यू बेक

1
भविष्य के दर्शकों के लिए यहां छोड़ना, जो यह भी सोच रहे हैं कि मूल वस्तु का विस्तार क्यों एक बुरा विचार है: stackoverflow.com/questions/14034180/…
बेन कूपर

690

gध्वज सेट के साथ एक नियमित अभिव्यक्ति का उपयोग सभी को प्रतिस्थापित करेगा:

someString = 'the cat looks like a cat';
anotherString = someString.replace(/cat/g, 'dog');
// anotherString now contains "the dog looks like a dog"

यहां भी देखें


15
Kinda मूर्खतापूर्ण मुझे लगता है, लेकिन JS Global regex कई रीप्लेस करने का एकमात्र तरीका है।
माइक

5
अच्छी तरह से तकनीकी रूप से आप var sourceTextउदाहरणों की संख्या की गणना कर सकते हैं ( numOfInstances) का उपयोग करके substringया विभाजित कर सकते हैं और तब की लंबाई (अन्य रणनीतियों के बीच) की गणना कर सकते thatWhichYouWantToReplaceहैं for (var i = 0; i < numOfInstances; i++){ sourceText = sourceText.replace('thatWhichYouWantToReplace', '');} या इससे भी आसान बस थोड़ी देर के लूप ( while sourceText.indexOf(thatWhichYouWantToReplace > -1){ sourceText = sourceText.replace(...)) का उपयोग करें, लेकिन मुझे नहीं लगता कि आप क्यों करना चाहते हैं इसे इस तरह से करें जब उपयोग /gकरना इतना आसान हो और शायद अधिक प्रदर्शन करने वाला हो।
जरगोल्ड

@Zargold आप यह सुनिश्चित करने के लिए एक लूप करना चाहेंगे कि रिप्लेसमेंट के बाद भी आपने सभी इंस्टेंसेस को रिप्लेस कर दिया है, जो कि काफी सामान्य है। मेरा जवाब नीचे देखें stackoverflow.com/a/26089052/87520 पर
SamGoody

109

यहां स्वीकृत उत्तर के आधार पर एक स्ट्रिंग प्रोटोटाइप फ़ंक्शन है:

String.prototype.replaceAll = function (find, replace) {
    var str = this;
    return str.replace(new RegExp(find, 'g'), replace);
};

संपादित करें

यदि आपके findविशेष वर्ण होंगे तो आपको उनसे बचने की आवश्यकता है:

String.prototype.replaceAll = function (find, replace) {
    var str = this;
    return str.replace(new RegExp(find.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g'), replace);
};

बेला: http://jsfiddle.net/cdbzL/


5
लेकिन क्या होगा अगर findइसमें ऐसे अक्षर शामिल हैं .या $जिनके विशेष अर्थ हैं?
कॉलम

1
@callum उस स्थिति में आपको अपने खोज चर (ऊपर संपादित देखें) से बचना होगा।
जेस्साल


jesal, यह मेरे द्वारा सामना की गई स्ट्रिंग प्रतिस्थापन समस्या का एक अद्भुत समाधान है, और यह स्पष्ट रूप से जावास्क्रिप्ट में स्ट्रिंग्स की "अपरिवर्तनीयता" को खत्म करता है। क्या आप या कोई और समझा सकता है कि यह प्रोटोटाइप फ़ंक्शन स्ट्रिंग्स की अपरिहार्यता को कैसे पार करता है? यह काम करता है ; मैं सिर्फ इस सहायक प्रश्न को समझना चाहता हूं जो यह प्रस्तुत करता है।
टॉम

1
@ टोम: यह अपरिवर्तनीयता को दूर नहीं करता है : var str = thisअपरिवर्तनीय स्ट्रिंग के लिए एक दूसरा संदर्भ बनाता है, जिसमें replaceविधि लागू होती है, जो बदले में एक नई अपरिवर्तनीय स्ट्रिंग लौटाती है । ये प्रोटोटाइप फ़ंक्शंस एक नई अपरिवर्तनीय स्ट्रिंग लौटाते हैं, यदि नहीं, तो आप लिख पाएंगे someStrVar.replaceAll('o', '0');और someStrVarइसे बदला जा सकेगा। इसके बजाय, आपको नया अपरिवर्तनीय स्ट्रिंगsomeStrVar = someStrVar.replaceAll('o', '0'); रखने के लिए var सेट करने के लिए <- reassign लिखना होगा । उसके आसपास कोई रास्ता नहीं है। सांत्वना में प्रयास करें:x = 'foobar'; x.replaceAll('o', '0'); x;
एलियास वान ओटगेम

87

अपडेट करें:

अपडेट के लिए कुछ देर हो गई है, लेकिन जब से मैंने इस सवाल पर सिर्फ ठोकर खाई है, और देखा कि मेरा पिछला जवाब वह नहीं है जिससे मैं खुश हूं। चूंकि प्रश्न में एक शब्द को बदलना शामिल है, इसलिए यह अविश्वसनीय है कि किसी ने शब्द सीमाओं का उपयोग करने के बारे में नहीं सोचा ( \b)

'a cat is not a caterpillar'.replace(/\bcat\b/gi,'dog');
//"a dog is not a caterpillar"

यह एक सरल रीगेक्स है जो अधिकांश मामलों में शब्दों के कुछ हिस्सों को बदलने से बचता है। हालांकि, एक डैश -को अभी भी एक शब्द सीमा माना जाता है। तो इस मामले में सशर्त का उपयोग इस तरह किया जा सकता है जैसे तार को बदलने से बचने के लिए cool-cat:

'a cat is not a cool-cat'.replace(/\bcat\b/gi,'dog');//wrong
//"a dog is not a cool-dog" -- nips
'a cat is not a cool-cat'.replace(/(?:\b([^-]))cat(?:\b([^-]))/gi,'$1dog$2');
//"a dog is not a cool-cat"

मूल रूप से, यह प्रश्न यहाँ के प्रश्न के समान है: जावास्क्रिप्ट "" "" "" से प्रतिस्थापित करता है

@ माइक, मेरे द्वारा दिए गए उत्तर की जांच करें ... regexp एक उप-विभाजन की कई घटनाओं को प्रतिस्थापित करने का एकमात्र तरीका नहीं है, इससे दूर। लचीला सोचो, विभाजन सोचो!

var newText = "the cat looks like a cat".split('cat').join('dog');

वैकल्पिक रूप से, शब्द भागों को बदलने से रोकने के लिए-अनुमोदित उत्तर भी करेगा! आप नियमित अभिव्यक्ति के उपयोग से इस मुद्दे पर पहुँच सकते हैं, मैं मानता हूँ, कुछ और अधिक जटिल है और उस के एक upshot के रूप में, एक बहुत धीमी, भी:

var regText = "the cat looks like a cat".replace(/(?:(^|[^a-z]))(([^a-z]*)(?=cat)cat)(?![a-z])/gi,"$1dog");

आउटपुट, स्वीकृत उत्तर के समान है, हालाँकि, इस स्ट्रिंग पर / cat / g अभिव्यक्ति का उपयोग कर रहा है:

var oops = 'the cat looks like a cat, not a caterpillar or coolcat'.replace(/cat/g,'dog');
//returns "the dog looks like a dog, not a dogerpillar or cooldog" ?? 

उफ़ वास्तव में, यह संभवतः वह नहीं है जो आप चाहते हैं। फिर क्या है? IMHO, एक रेगीक्स जो केवल 'बिल्ली' को सशर्त रूप से प्रतिस्थापित करता है। (अर्थात एक शब्द का हिस्सा नहीं), जैसे:

var caterpillar = 'the cat looks like a cat, not a caterpillar or coolcat'.replace(/(?:(^|[^a-z]))(([^a-z]*)(?=cat)cat)(?![a-z])/gi,"$1dog");
//return "the dog looks like a dog, not a caterpillar or coolcat"

मेरा अनुमान है, यह आपकी जरूरतों को पूरा करता है। यह फुलप्रूफ नहीं है, लेकिन यह आपको शुरू करने के लिए पर्याप्त होना चाहिए। मैं इन पृष्ठों पर कुछ और पढ़ने की सलाह दूंगा। यह आपकी विशिष्ट आवश्यकताओं को पूरा करने के लिए इस अभिव्यक्ति को पूर्ण करने में उपयोगी साबित होगा।

http://www.javascriptkit.com/jsref/regexp.shtml

http://www.regular-expressions.info


अंतिम जोड़:

यह देखते हुए कि इस प्रश्न को अभी भी बहुत सारे विचार मिलते हैं, मैंने सोचा कि मैं .replaceकॉलबैक फ़ंक्शन के साथ उपयोग किए गए उदाहरण को जोड़ सकता हूं । इस मामले में, यह नाटकीय रूप से अभिव्यक्ति को सरल बनाता है और इससे भी अधिक लचीलापन प्रदान करता है, जैसे कि सही कैपिटलाइज़ेशन के साथ या दोनों में catऔर catsएक ही जगह पर :

'Two cats are not 1 Cat! They\'re just cool-cats, you caterpillar'
   .replace(/(^|.\b)(cat)(s?\b.|$)/gi,function(all,char1,cat,char2)
    {
       //check 1st, capitalize if required
       var replacement = (cat.charAt(0) === 'C' ? 'D' : 'd') + 'og';
       if (char1 === ' ' && char2 === 's')
       {//replace plurals, too
           cat = replacement + 's';
       }
       else
       {//do not replace if dashes are matched
           cat = char1 === '-' || char2 === '-' ? cat : replacement;
       }
       return char1 + cat + char2;//return replacement string
    });
//returns:
//Two dogs are not 1 Dog! They're just cool-cats, you caterpillar

मुझे लगता है कि अतिरिक्त दिलचस्प हिस्से को नीचे रखना चाहिए। ps: मैंने अभी देखा कि पहली पंक्ति का आधा हिस्सा क्षेत्र से बाहर है, मुझे इसे ठीक करने की अनुमति दें!

69

एक वैश्विक नियमित अभिव्यक्ति के खिलाफ मैच:

anotherString = someString.replace(/cat/g, 'dog');

60

एक ही समय के उपयोग की जगह के लिए:

var res = str.replace('abc', "");

कई बार उपयोग की जगह के लिए:

var res = str.replace(/abc/g, "");

किसी को \ n को बदलने की आवश्यकता है, आप इसे पसंद कर सकते हैं:replace(/\n/g, '<br/>')
फान वान

58

ये सबसे आम और पठनीय विधियाँ हैं।

var str = "Test abc test test abc test test test abc test test abc"

विधि 1:

str = str.replace(/abc/g, "replaced text");

विधि 2:

str = str.split("abc").join("replaced text");

विधि 3:

str = str.replace(new RegExp("abc", "g"), "replaced text");

विधि 4:

while(str.includes("abc")){
    str = str.replace("abc", "replaced text");
}

आउटपुट:

console.log(str);
// Test replaced text test test replaced text test test test replaced text test test replaced text

44
str = str.replace(/abc/g, '');

या यहाँ से ReplaceAll फ़ंक्शन आज़माएँ:

उपयोगी जावास्क्रिप्ट तरीके क्या हैं जो अंतर्निहित वस्तुओं का विस्तार करते हैं?

str = str.replaceAll('abc', ''); OR

var search = 'abc';
str = str.replaceAll(search, '');

EDIT: ReplaceAll उपलब्धता के बारे में स्पष्टीकरण

String के प्रोटोटाइप में 'ReplaceAll' पद्धति जोड़ी जाती है। इसका मतलब है कि यह सभी स्ट्रिंग ऑब्जेक्ट / शाब्दिक के लिए उपलब्ध होगा।

उदाहरण के लिए

var output = "test this".replaceAll('this', 'that');  //output is 'test that'.
output = output.replaceAll('that', 'this'); //output is 'test this'

2
क्या आप प्रोटोटाइप का उपयोग नहीं करने वालों के लिए रिप्लेसमैट () फ़ंक्शन को फिर से लिख सकते हैं?
क्लिक करें अपवोट

@ क्लिक करें अपवोट .... आप प्रोटोटाइप का उपयोग कर रहे हैं, यह सभी JS ऑब्जेक्ट्स का हिस्सा है। मुझे लगता है कि आप जेएस लाइब्रेरी के प्रोटोटाइप के बारे में सोच रहे हैं।
सेठ १

सेठ, थोड़ा सुधार। यदि आप एक प्रोटोटाइप में विधि जोड़ते हैं, तो यह उस प्रकार की सभी वस्तुओं के लिए उपलब्ध है। प्रतिकृति पद्धति को स्ट्रिंग प्रोटोटाइप में जोड़ा गया था और इसे सभी स्ट्रिंग ऑब्जेक्ट्स के लिए काम करना चाहिए।
SolutionYogi

@Solutionyogi - हां, मैंने पहले प्रोटोटाइप (सही ढंग से) का उपयोग किया है। मैं सिर्फ "प्रोटोटाइप का उपयोग नहीं करने" के बारे में ओपी की टिप्पणी को संबोधित कर रहा था जिसे मैंने प्रोटोटाइप (जे) का मतलब माना (शायद गलत तरीके से?)। मुझे "एक प्रोटोटाइप" कहना चाहिए था क्योंकि मैं यह कहना चाह रहा था कि जावास्क्रिप्ट ऑब्जेक्ट्स का एक प्रोटोटाइप है। इस प्रकार, ओपी पहले से ही "अप्रत्यक्ष" तरीके से प्रोटोटाइप का उपयोग कर रहा था। अप्रत्यक्ष रूप से यहाँ उपयोग करने के लिए गलत शब्द हो सकता है, लेकिन मैं बहुत थक गया हूँ।
सेठ

41

का प्रयोग RegExpमें जावास्क्रिप्ट आप के लिए काम कर सकता है, बस नीचे दिए गए कोड की तरह कुछ करते हैं, मत भूलना /gके लिए जो असाधारण के बाद वैश्विक :

var str ="Test abc test test abc test test test abc test test abc";
str = str.replace(/abc/g, '');

यदि आप पुन: उपयोग के बारे में सोचते हैं, तो आपके लिए ऐसा करने के लिए एक फ़ंक्शन बनाएं, लेकिन यह अनुशंसित नहीं है क्योंकि यह केवल एक पंक्ति फ़ंक्शन है, लेकिन फिर से यदि आप इसका भारी उपयोग करते हैं, तो आप इस तरह से कुछ लिख सकते हैं:

String.prototype.replaceAll = String.prototype.replaceAll || function(string, replaced) {
  return this.replace(new RegExp(string, 'g'), replaced);
};

और बस नीचे की तरह अपने कोड में इसका उपयोग करें:

var str ="Test abc test test abc test test test abc test test abc";
str = str.replaceAll('abc', '');

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


40

कहें कि आप सभी 'एबीसी' को 'x' से बदलना चाहते हैं:

let some_str = 'abc def def lom abc abc def'.split('abc').join('x')
console.log(some_str) //x def def lom x x def

मैं स्ट्रिंग प्रोटोटाइप को संशोधित करने से अधिक सरल कुछ के बारे में सोचने की कोशिश कर रहा था।


1
सरल, आसान और शायद सबसे अच्छा विकल्प: अच्छा जवाब।
मशीनगॉस्ट

वास्तव में, जब तक मैं इसे व्यक्तिगत रूप से मीट्रिक-एड नहीं करता, विभाजन / जुड़ना आमतौर पर एक बहुत अच्छा समाधान है।
मशीनगॉस्ट

1
यह क्रोम में भी है, फ़ायरफ़ॉक्स पर 100% तेज़, और IE पर 50% धीमा ...: jsperf.com/replace-regex-split-join
Olivier


32

एकल उद्धरण की जगह:

function JavaScriptEncode(text){
    text = text.replace(/'/g,'&apos;')
    // More encode here if required

    return text;
}

2
तार बदलने के लिए मैं दूसरी पंक्ति कैसे बदल सकता हूं? यह काम नहीं करता है: पाठ = text.replace ('हे', 'हैलो'); कोई उपाय?
स्टीफन đorđević

2
श्योर स्टीफन, यहाँ कोड है ... पाठ = text.replace (/ हे / जी, 'हैलो');
क्रिस रोजेटे

26

// इसे लूप करें जब तक कि नंबर घटने न आए 0. या बस कॉपी / पेस्ट करें

    function replaceAll(find, replace, str) 
    {
      while( str.indexOf(find) > -1)
      {
        str = str.replace(find, replace);
      }
      return str;
    }

23
यह विधि खतरनाक है, इसका उपयोग न करें। यदि प्रतिस्थापन स्ट्रिंग में खोज कीवर्ड शामिल है, तो एक अनंत लूप होगा। बहुत कम से कम, .indexOfएक चर के परिणाम को संग्रहीत करें , और इस चर का दूसरे पैरामीटर के रूप में उपयोग करें .indexOf(कीवर्ड की शून्य से लंबाई, प्रतिस्थापन स्ट्रिंग की लंबाई)।
रोब डब्ल्यू

मैं पहले खोज पैटर्न को एक यूनीकोड ​​यूनिकोड चार के साथ बदलने के बारे में सोच रहा हूं, इसमें से हमें यकीन है कि इसका उपयोग इनपुट स्ट्रिंग में नहीं किया गया है। निजी क्षेत्र में U + E000 की तरह। और फिर इसे वापस लक्ष्य पर बदलें। मैंने यहां निर्माण किया है। । मुझे यकीन नहीं है कि अगर एक अच्छा विचार है।
लक्स

26
str = str.replace(new RegExp("abc", 'g'), "");

उपरोक्त उत्तरों की तुलना में मेरे लिए बेहतर काम किया। इसलिए new RegExp("abc", 'g')एक RegExp बनाता है 'g'जो पाठ की सभी घटना ( ध्वज) से मेल खाता है ( "abc")। दूसरा भाग वह है जो आपके मामले में रिक्त स्ट्रिंग ( "") में प्रतिस्थापित हो जाता है । strयह स्ट्रिंग है, और हमें इसे ओवरराइड करना होगा, जैसा कि replace(...)केवल परिणाम देता है, लेकिन ओवरराइड नहीं होता है। कुछ मामलों में आप इसका उपयोग करना चाह सकते हैं।


हालांकि यह कोड स्निपेट समाधान हो सकता है, स्पष्टीकरण सहित वास्तव में आपके पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है।
यिवि

हां आप ठीक हैं। जोड़ा। मूल प्रश्न का उत्तर देने के लिए इसे संपादित भी किया गया :)
सीएसओएमकेक

नोट: g झंडा रेगेक्स में इसका मतलब है कि यह वैश्विक ध्वज है जो सभी घटनाओं से मेल खाएगा
Firstpostcommenter

25

यह सबसे तेज संस्करण है जो नियमित अभिव्यक्ति का उपयोग नहीं करता है

संशोधित जेस्पर

replaceAll = function(string, omit, place, prevstring) {
  if (prevstring && string === prevstring)
    return string;
  prevstring = string.replace(omit, place);
  return replaceAll(prevstring, omit, place, string)
}

यह विभाजन और शामिल होने की विधि के रूप में लगभग दोगुना है

जैसा कि यहां एक टिप्पणी में बताया गया है, यह काम नहीं करेगा यदि आपका omitचर शामिल है place, जैसे कि:replaceAll("string", "s", "ss") , क्योंकि यह हमेशा शब्द की एक और घटना को बदलने में सक्षम होगा।

मेरी पुनरावर्ती जगह पर वेरिएंट के साथ एक और jsperf है जो और भी तेज़ी से चलते हैं ( http://jsperf.com/replace-all-vs-split-join/12 )!

  • 27 जुलाई 2017 को अपडेट करें: ऐसा लग रहा है कि हाल ही में जारी क्रोम 59 में RegExp का प्रदर्शन सबसे तेज है।

मुझे आपका समाधान अच्छा लगा ... मेरी इच्छा है कि मैं आपको +10 दे सकूं लेकिन यहाँ मेरा +1 है। मुझे लगता है कि आप सब-स्ट्रिंग के इंडेक्स को स्टोर कर सकते हैं जिसे बदल दिया गया था और अगर उस अनंत लूप की समस्या से बचने के लिए एक कम इंडेक्स पर मैच पाया जाता है तो अगले पर कूदें। मैं प्रदर्शन के बारे में टिप्पणी नहीं कर सकता क्योंकि मैंने इसका परीक्षण नहीं किया था, लेकिन उत्कृष्टता के इस टुकड़े पर मेरा सिर्फ 2 सेंट है।
Fr0zenFyr

@ fr0zenfyr अगर आप जांचना चाहते हैं कि क्या omit जगह पर है (अनंत लूप को रोकने के लिए) तो आप if(place.replace(omit) === omit) {बिना मैच की तरह एक सशर्त कर सकते हैं , इसलिए प्रतिस्थापन लूप } else {मैच का उपयोग करना सुरक्षित है इसलिए विभाजन और }
कोल लॉरेंस

हम्म .. लेकिन दो समाधान के संयोजन की बात क्या है? मैं वैसे भी स्प्लिट / ज्वाइन एप्रोच का प्रशंसक नहीं हूँ .. धन्यवाद सलाह के लिए ..
Fr0zenFyr

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

@ मोमो कैसे त्रुटिपूर्ण है?
सैंडरॉक

24

प्रदर्शन

आज 27.12.2019 को मैं macOS v10.13.6 पर परीक्षण करता हूं चुने हुए समाधानों के लिए (हाई सिएरा) ।

निष्कर्ष

  • str.replace(/abc/g, '');( सी) ) सभी स्ट्रिंग्स के लिए एक अच्छा क्रॉस-ब्राउज़र तेजी से समाधान है।
  • split-join( ए, बी ) या replace( सी, डी ) पर आधारित समाधान ) तेज हैं
  • समाधान while( ई, एफ, जी, एच पर आधारित है ) धीमे होते हैं - आमतौर पर छोटे तारों के लिए ~ 4 गुना धीमा और लंबे तारों के लिए लगभग 3000 गुना (!) धीमा होता है।
  • पुनरावृत्ति समाधान ( आरए, आरबी ) धीमे हैं और लंबे तारों के लिए काम नहीं करते हैं

मैं भी अपना हल बनाता हूं। ऐसा लगता है कि वर्तमान में यह सबसे छोटा है जो प्रश्न करता है:

str.split`abc`.join``

विवरण

परीक्षण क्रोम 79.0, सफारी 13.0.4 और फ़ायरफ़ॉक्स 71.0 (64 बिट) पर किए गए थे। परीक्षण RAऔर RBपुनरावृत्ति का उपयोग करें। परिणाम

यहां छवि विवरण दर्ज करें

लघु स्ट्रिंग - 55 वर्ण

आप यहां अपनी मशीन पर परीक्षण चला सकते हैं । क्रोम के लिए परिणाम:

यहां छवि विवरण दर्ज करें

लंबी स्ट्रिंग: 275 000 वर्ण

आरए और आरबी पुनरावर्ती समाधान देता है

रेंजError: अधिकतम कॉल स्टैक का आकार पार हो गया

1M वर्णों के लिए वे Chrome को भी तोड़ते हैं

यहां छवि विवरण दर्ज करें

मैं अन्य समाधानों के लिए 1M वर्णों के लिए परीक्षण करने की कोशिश करता हूं, लेकिन E, F, G, H में इतना समय लगता है कि ब्राउज़र मुझसे स्क्रिप्ट तोड़ने के लिए कहता है इसलिए मैं परीक्षण स्ट्रिंग को 275K वर्णों तक सिकोड़ता हूं। आप यहां अपनी मशीन पर परीक्षण चला सकते हैं । क्रोम के लिए परिणाम

यहां छवि विवरण दर्ज करें

परीक्षणों में प्रयुक्त कोड


1
अब यह गहराई से उत्तर में एक नरक है! आपका बहुत बहुत धन्यवाद! हालाँकि, मैं इस बारे में उत्सुक हूं कि "नया RegExp (...)" सिंटैक्स क्यों सुधार देता है।
मर्क ग्रगली डोलिंका

21

यदि आप जो ढूंढना चाहते हैं वह पहले से ही एक स्ट्रिंग में है, और आपके पास रेगेक्स एस्कॉपर काम नहीं है, तो आप इसमें शामिल / चयन कर सकते हैं:

    function replaceMulti(haystack, needle, replacement)
    {
        return haystack.split(needle).join(replacement);
    }

    someString = 'the cat looks like a cat';
    console.log(replaceMulti(someString, 'cat', 'dog'));


धन्यवाद! यह समाधान मेरी समस्या के लिए पूरी तरह से काम करता है :)
xero399

19
function replaceAll(str, find, replace) {
  var i = str.indexOf(find);
  if (i > -1){
    str = str.replace(find, replace); 
    i = i + replace.length;
    var st2 = str.substring(i);
    if(st2.indexOf(find) > -1){
      str = str.substring(0,i) + replaceAll(st2, find, replace);
    }       
  }
  return str;
}

मुझे आश्चर्य है कि यह कितना अच्छा प्रदर्शन करता है ... मूल चरित्र है या नए वर्ण बनाने के लिए चार सरणी पर चलता है।
mmm

16

मुझे यह तरीका पसंद है (यह थोड़ा साफ दिखता है):

text = text.replace(new RegExp("cat","g"), "dog"); 

1
ठीक है, आप इसे रेगेक्स पैटर्न के रूप में उपयोग करने के लिए स्ट्रिंग से कैसे बचेंगे?
रक्सलिस

मैं नहीं, मैं सिर्फ सादे पाठ के लिए इसका इस्तेमाल करते हैं
ओवेन

15

किसी भी रेगेक्स का उपयोग किए बिना इसका सबसे सरल तरीका विभाजित है और यहां कोड की तरह शामिल हो सकता है:

var str = "Test abc test test abc test test test abc test test abc";
str.split('abc').join('')

13
var str = "ff ff f f a de def";
str = str.replace(/f/g,'');
alert(str);

http://jsfiddle.net/ANHR9/


क्या एक बेला की बात थी जिसमें केवल एक ही जावास्क्रिप्ट शामिल है
Jallallardo



13

पिछले उत्तर रास्ता बहुत जटिल हैं। बस इस तरह बदलें समारोह का उपयोग करें:

str.replace(/your_regex_pattern/g, replacement_string);

उदाहरण:

var str = "Test abc test test abc test test test abc test test abc";

var res = str.replace(/[abc]+/g, "");

console.log(res);


10

यदि आप यह सुनिश्चित करने की कोशिश कर रहे हैं कि जिस स्ट्रिंग की आप तलाश कर रहे हैं वह प्रतिस्थापन के बाद भी मौजूद नहीं है, तो आपको लूप का उपयोग करने की आवश्यकता है।

उदाहरण के लिए:

var str = 'test aabcbc';
str = str.replace(/abc/g, '');

जब पूरा हो जाएगा, तब भी आपके पास 'टेस्ट एबीसी' होगा!

इसे हल करने के लिए सबसे सरल लूप होगा:

var str = 'test aabcbc';
while (str != str.replace(/abc/g, '')){
   str.replace(/abc/g, '');
}

लेकिन वह प्रत्येक चक्र के लिए दो बार प्रतिस्थापन चलाता है। शायद (मतदान के जोखिम में होने के कारण) जिसे थोड़ा अधिक कुशल लेकिन कम पठनीय रूप के लिए जोड़ा जा सकता है:

var str = 'test aabcbc';
while (str != (str = str.replace(/abc/g, ''))){}
// alert(str); alerts 'test '!

डुप्लिकेट स्ट्रिंग्स की तलाश में यह विशेष रूप से उपयोगी हो सकता है।
उदाहरण के लिए, यदि हमारे पास 'ए ,,, बी' है और हम सभी डुप्लिकेट कॉमा को हटाना चाहते हैं।
[उस मामले में, कोई भी .replace (/, + / g, ',') कर सकता है, लेकिन कुछ बिंदु पर रेगेक्स जटिल और धीमा हो जाता है, बजाय लूप में।]


10

यद्यपि लोगों ने रेगेक्स के उपयोग का उल्लेख किया है, लेकिन यदि आप पाठ के मामले की परवाह किए बिना पाठ को बदलना चाहते हैं तो एक बेहतर तरीका है। अपरकेस या लोअरकेस की तरह। सिंटैक्स का उपयोग करें

//Consider below example
originalString.replace(/stringToBeReplaced/gi, '');

//Output will be all the occurrences removed irrespective of casing.

आप यहां विस्तृत उदाहरण देख सकते हैं ।


उदाहरण साइट से: "/ toBeReplacedString / gi regex है जिसे आपको उपयोग करने की आवश्यकता है। यहां g वैश्विक मैच के लिए प्रतिनिधित्व करता है और मैं केस असंवेदनशील का प्रतिनिधित्व करता हूं। डिफ़ॉल्ट रूप से regex केस संवेदनशील है"
alikuli 3'16

8

आप बस नीचे विधि का उपयोग कर सकते हैं

/**
 * Replace all the occerencess of $find by $replace in $originalString
 * @param  {originalString} input - Raw string.
 * @param  {find} input - Target key word or regex that need to be replaced.
 * @param  {replace} input - Replacement key word
 * @return {String}       Output string
 */
function replaceAll(originalString, find, replace) {
  return originalString.replace(new RegExp(find, 'g'), replace);
};

7

बस जोड़ दो /g

document.body.innerHTML = document.body.innerHTML.replace('hello', 'hi');

सेवा

// Replace 'hello' string with /hello/g regular expression.
document.body.innerHTML = document.body.innerHTML.replace(/hello/g, 'hi');

/g वैश्विक मतलब है

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