एक कॉल में एक से अधिक वर्ण बदलें


256

बहुत आसान सा सवाल है, लेकिन मुझे समझ में नहीं आता है कि यह कैसे करना है।

मुझे '_' के प्रत्येक उदाहरण को एक स्थान के साथ बदलने की आवश्यकता है, और '#' के प्रत्येक उदाहरण को कुछ नहीं / खाली के साथ।

var string = '#Please send_an_information_pack_to_the_following_address:';

मैंने यह कोशिश की है:

string.replace('#','').replace('_', ' ');

मैं वास्तव में इस तरह के आदेशों का पीछा करना पसंद नहीं करता। क्या इसमें एक और तरीका है?


इस सवाल का जवाब देखें: stackoverflow.com/questions/7072330/…
DeweyOx

जवाबों:


513

OR ऑपरेटर ( |) का उपयोग करें :

var str = '#this #is__ __#a test###__';
str.replace(/#|_/g,''); // result: "this is a test"

तुम भी एक चरित्र वर्ग का उपयोग कर सकते हैं:

str.replace(/[#_]/g,'');

बेला

यदि आप हैश को एक चीज़ से बदलना चाहते हैं और दूसरे के साथ अंडरस्कोर, तो आपको बस चेन करना होगा। हालाँकि, आप एक प्रोटोटाइप जोड़ सकते हैं:

String.prototype.allReplace = function(obj) {
    var retStr = this;
    for (var x in obj) {
        retStr = retStr.replace(new RegExp(x, 'g'), obj[x]);
    }
    return retStr;
};

console.log('aabbaabbcc'.allReplace({'a': 'h', 'b': 'o'}));
// console.log 'hhoohhoocc';

क्यों नहीं चेन, हालांकि? मुझे उस में कुछ भी गलत नहीं दिखता है।


यह अच्छा है, लेकिन मुझे खाली नहीं बल्कि रिक्त स्थान के साथ अंडरस्कोर को बदलने की आवश्यकता है, क्या मैं ऐसा कर सकता हूं?
शैनन होकिन्स

ऐसा सोचा है, लेकिन फिर भी आपने मुझे यह समझने में मदद की है कि कैसे अभिव्यक्ति की जगह थोड़ी बेहतर काम करती है :)
शैनन होच्किन्स

आपका प्रोटोटाइप काम नहीं करता है? क्या आप फिडल पर एक उदाहरण प्रदान करने में सक्षम हैं, मुझे त्रुटियाँ
मिलती रहती

3
के लिए एक और विकल्प #|_है [#_], और आप +प्रदर्शन में सुधार करने के लिए किसी भी लगातार मैच का उपयोग करने के लिए उपयोग कर सकते हैं
इयान

3
कूल थैंक्स ... अगर जरूरत हो तो खाली जगहों की और दूसरे प्रतीकों str.replace(/[+ -]/g,'');को बीच में खाली जगह लगाने की।
बराबर

53

चेनिंग शांत है, इसे खारिज क्यों करें?

वैसे भी, यहाँ एक विकल्प में एक और विकल्प है:

string.replace(/#|_/g,function(match) {return (match=="#")?"":" ";})

प्रतिस्थापित "" होगा यदि मैच == "#", "" यदि नहीं।

[अपडेट] अधिक सामान्य समाधान के लिए, आप अपने प्रतिस्थापन स्ट्रिंग को किसी ऑब्जेक्ट में संग्रहीत कर सकते हैं:

var replaceChars={ "#":"" , "_":" " };
string.replace(/#|_/g,function(match) {return replaceChars[match];})

4
इसे अतिरिक्त चरण में लें: var regex = new RegExp( Object.keys(replaceChars).join("|"), "g"); string.replace(regex,function(match) {return replaceChars[match];})इससे रिप्लेसमेंट को आसान बनाना आसान हो गया है।
रोजा

@RozzA धन्यवाद। Object.key उस समय मुख्यधारा नहीं थी।
क्रिस्टोफ

मैं दूसरे पैरामीटर को बदलने के लिए प्रतिस्थापन फ़ंक्शन विकल्प के बारे में पूरी तरह से भूल गया, मुझे याद रखने में मदद करने के लिए :)
Luckylooke

48

यदि आप एक से अधिक वर्णों को प्रतिस्थापित करना चाहते हैं, तो आप String.prototype.replace()प्रतिस्थापन तर्क को एक फ़ंक्शन कह सकते हैं जिसे प्रत्येक मैच के लिए कहा जाता है। आप सभी की जरूरत है एक चरित्र मानचित्रण का प्रतिनिधित्व करता है जो आप उस फ़ंक्शन में उपयोग करेंगे।

उदाहरण के लिए, अगर आप चाहते हैं aके साथ बदल दिया x, bसाथ yऔर cसाथ z, आप कुछ इस तरह कर सकते हैं:

var chars = {'a':'x','b':'y','c':'z'};
var s = '234abc567bbbbac';
s = s.replace(/[abc]/g, m => chars[m]);
console.log(s);

आउटपुट :234xyz567yyyyxz


3
जब से तुम ES6 का उपयोग करें (तीर समारोह) आप भी बदलना चाहिए varसाथ constयहाँ। विस्तारित ब्राउज़र समर्थन के लिए एक विकल्प:var s ='234abc567bbbbac'; s = s.replace(/[abc]/g, function(m) { return {'a':'x','b':'y','c':'z'}[m]; }); console.log(s);
फेलिक्स गेनेन

1
@FelixGeenen 1. आप पोर्टेबिलिटी को मारते हैं 2. यदि आप चार्ट को फिर से परिभाषित करने या चुनने के लिए चुनते हैं, तो आपको एक रनटाइम त्रुटि मिलेगी, जो इसकी 'मजबूती' को मारती है, 3. शुद्ध रूप से वैचारिक लोगों की तुलना में एस को उत्परिवर्तन और विद्रोह से बचाने के लिए कोई वारंट नहीं है। यह देखने के लिए एक अद्भुत बात है कि यह स्निपेट अभी भी डबल क्लिक / cscript / wscript पर नए सिरे से स्थापित windows98 में काम करेगा:var chars = {a:'1', b:'2', c:'3'}; var s = '123abc123'; var u = s.replace(/[abc]/g, function(m) { return chars[m]; }); WScript.echo(u);
दिमित्री

यह सचमुच अच्छा है। धन्यवाद। वह कौन सा भाग है जहाँ आपने किसी वस्तु का उपयोग किसी कथन या कथन के लिए किया है। क्या आपके पास उस चीज़ के बारे में प्रलेखन या संदर्भ है जो यह बताता है कि। बहुत अच्छा उपयोग मामला है।
ईसाई मैथ्यू

39

/gकेवल पहले के बजाय सभी मैचों को बदलने के लिए नियमित अभिव्यक्ति पर वैश्विक (वैश्विक) ध्वज निर्दिष्ट करें :

string.replace(/_/g, ' ').replace(/#/g, '')

एक चीज़ को एक चीज़ से बदलने के लिए और कुछ के साथ एक अलग चरित्र के लिए, आपको वास्तव में दो अलग-अलग कॉल की आवश्यकता नहीं है replace। आप इसे एक फ़ंक्शन में सार कर सकते हैं जैसा कि डॉर्कनोब ने किया था, हालांकि मैं शायद एक फ्लैट सरणी के बजाय कुंजी / मूल्य जोड़े के रूप में पुराने / नए के साथ एक वस्तु ले जाऊंगा।


मैं हैश को भी कैसे शामिल करूंगा?
शैनन होकिन्स

4

आप यह भी आज़मा सकते हैं:

function replaceStr(str, find, replace) {
    for (var i = 0; i < find.length; i++) {
        str = str.replace(new RegExp(find[i], 'gi'), replace[i]);
    }
    return str;
}

var text = "#here_is_the_one#";
var find = ["#","_"];
var replace = ['',' '];
text = replaceStr(text, find, replace);
console.log(text);

find पाठ को संदर्भित करता है और पाया जाना चाहिए replace प्रतिस्थापित किया जाना चाहिए

यह केस असंवेदनशील पात्रों की जगह लेगा। अन्य तरीके से करने के लिए बस आवश्यकता के अनुसार रेगेक्स के झंडे बदलें। जैसे: केस सेंसिटिव रिप्लेस के लिए:

new RegExp(find[i], 'g')

4

आप बस यह कोशिश कर सकते हैं:

str.replace(/[.#]/g, 'replacechar');

यह प्रतिस्थापित करेगा। - और # अपने प्रतिस्थापन के साथ!


यह उत्तर पहले ही प्रदान किया जा चुका है और अन्य पात्रों के साथ अलग-अलग पात्रों को बदलने का काम नहीं करता है, ओपी देखें।
शैनन होकिन्स

3

यहाँ RegEx बिना इसे करने का एक सरल तरीका है।
आप चीजों को इच्छानुसार प्रोटोटाइप और / या कैश कर सकते हैं।

// Example: translate( 'faded', 'abcdef', '123456' ) returns '61454'
function translate( s, sFrom, sTo ){
    for ( var out = '', i = 0; i < s.length; i++ ){
        out += sTo.charAt( sFrom.indexOf( s.charAt(i) ));
    }
    return out;
}

मुझे पता है कि आपने इसे नहीं बताया है, लेकिन क्या सिर्फ रेगेक्स का उपयोग करना अधिक सुरुचिपूर्ण नहीं है? str.replace(/#|_/g,'')
शैनन होकिन्स

1
@ShannonHochkins यकीन के लिए! मैं RegEx पर बकवास करने के लिए मतलब नहीं है; मैं सिर्फ एक और विकल्प दिखा रहा हूं। RegEx हमेशा सहज नहीं है और खुद को "एक हथौड़ा के रूप में इस्तेमाल करने के लिए उधार देता है, हर समस्या को एक नाखून के रूप में मानता है"। अन्य जवाबों को देखते हुए, पुन: प्रयोज्य फ़ंक्शन के रूप में यह एक बहुत लंबा नहीं है, और मापदंडों को समझना आसान है। व्यक्तिगत रूप से मैं यहाँ प्रश्न के लिए एक छोटे से RegEx के साथ जाऊँगा, और यह समझ में आता है कि यदि आप एक त्वरित ड्रॉप-इन स्निपेट की तलाश कर रहे हैं जिसे आप पूरी तरह से समझ नहीं पाते हैं।
बीजर

ठीक है, अगर आपको किसी वर्ण का अनुवाद करने की आवश्यकता है (आ ला sed वाई कमांड या आ ला यूनिक्स tr), तो यह सही उत्तर की तरह लगता है।
.दो

3

प्रयास करें:

  • मल्टी स्ट्रिंग बदलें

    var str = "http://www.abc.xyz.com"; str = str.replace(/http:|www|.com/g, ''); //str is "//.abc.xyz"

  • मल्टी चार्ट की जगह

    var str = "a.b.c.d,e,f,g,h"; str = str.replace(/[.,]/g, ''); //str is "abcdefgh";

सौभाग्य!


2

तुम भी एक RegExp ऑब्जेक्ट को प्रतिस्थापित विधि की तरह पास कर सकते हैं

var regexUnderscore = new RegExp("_", "g"); //indicates global match
var regexHash = new RegExp("#", "g");

string.replace(regexHash, "").replace(regexUnderscore, " ");

जावास्क्रिप्ट RegExp


ओपी चेन replaceकॉल नहीं करना चाहता है - इससे बचने में मदद नहीं करता है।
डेनिस

2

yourstring = '# प्लीज send_an_information_pack_to_the_following_address:';

'#' को '' से बदलें और '' 'को एक स्थान से बदलें

var newstring1 = yourstring.split('#').join('');
var newstring2 = newstring1.split('_').join(' ');

newstring2 आपका परिणाम है


आपका उत्तर jQuery के एक श्रेड का उपयोग नहीं करता है, और साथ ही ओपी का पालन नहीं करता है, '#this #is__ #a परीक्षण ### ' .split ('_')। join ('') के रूप में काम नहीं करेगा। आप अधिक
व्हॉट्सएप के

@ शॉनहॉन्किन्स अधिक सफेद स्थान कैसे जोड़े जाएंगे?
हफसुल मारू

मेरे उदाहरण पर एक नज़र डालें, जब किसी स्थान से पहले एक अंडरस्कोर होता है, या दो अंडरस्कोर आप कई स्थानों के साथ समाप्त करेंगे।
शैनन होकिन्स 22

@ShannonHochkins स्ट्रिंगर के साथ प्रश्नकर्ता ने कहा ' यहां कोई जगह नहीं है। मैं इसके बारे में क्यों सोचूंगा। जब सोचो, केवल अंतरिक्ष के बारे में क्यों, कई अन्य चीजें हो सकती हैं।
हफसुल मारू

मेरा सुझाव है कि आप ओपी को पढ़ें, मैं मूल पोस्टर हूं और आप मेरे पहले चर में स्पष्ट रूप से देख सकते हैं var str = '#this #is__ __#a test###__';कि इस स्ट्रिंग में कई रिक्त स्थान हैं।
शैनन होकिन्स

2

यहां स्ट्रिंग प्रोटोटाइप का उपयोग कर एक और संस्करण है। का आनंद लें!

String.prototype.replaceAll = function(obj) {
    let finalString = '';
    let word = this;
    for (let each of word){
        for (const o in obj){
            const value = obj[o];
            if (each == o){
                each = value;
            }
        }
        finalString += each;
    }

    return finalString;
};

'abc'.replaceAll({'a':'x', 'b':'y'}); //"xyc"

1

मुझे नहीं पता कि यह कितना मदद करेगा लेकिन मैं हटाना चाहता था <b>और</b> मेरी स्ट्रिंग से

इसलिए मैंने इस्तेमाल किया

mystring.replace('<b>',' ').replace('</b>','');

मूल रूप से यदि आप चाहते हैं कि सीमित संख्या में चरित्र कम हो और समय बर्बाद न हो तो यह उपयोगी होगा।


-1

यहां एक "सुरक्षित HTML" फ़ंक्शन है जो 'कम' एकाधिक प्रतिस्थापन फ़ंक्शन का उपयोग करता है (यह फ़ंक्शन प्रत्येक स्ट्रिंग को पूरे स्ट्रिंग पर लागू करता है, इसलिए प्रतिस्थापन के बीच निर्भरता महत्वपूर्ण है)।

// Test:
document.write(SafeHTML('<div>\n\
    x</div>'));

function SafeHTML(str)
    {
    const replacements = [
        {'&':'&amp;'},
        {'<':'&lt;'},
        {'>':'&gt;'},
        {'"':'&quot;'},
        {"'":'&apos;'},
        {'`':'&grave;'},
        {'\n':'<br>'},
        {' ':'&nbsp;'}
        ];
    return replaceManyStr(replacements,str);
    } // HTMLToSafeHTML

function replaceManyStr(replacements,str)
    {
    return replacements.reduce((accum,t) => accum.replace(new RegExp(Object.keys(t)[0],'g'),t[Object.keys(t)[0]]),str);
    }

पोस्ट के लिए धन्यवाद, हालांकि स्वीकृत उत्तर की तुलना में यह काफी व्यापक है
शैनन होकिन्स

प्रश्न का उत्तर एक-पंक्ति फ़ंक्शन है। वह "व्यापक" कैसे है? उपयोगकर्ता इनपुट को सुरक्षित बनाना एक महत्वपूर्ण उदाहरण है। तुम बहुत क्रिटिकल हो। 'कम' एक बहुत ही उपयोगी तकनीक है जिसके बारे में आपको पता होना चाहिए।
डेविड स्पेक्टर

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

मेरा उत्तर एक 'कम' उत्तर है क्योंकि यह Array.prototype.reduce फ़ंक्शन का उपयोग करता है। एक छोटा जवाब संपत्ति कुंजी के बजाय एक स्ट्रिंग का उपयोग कर सकता है, इस तथ्य का फायदा उठाता है कि "सुरक्षित HTML" फ़ंक्शन केवल एकल वर्णों को बदलने पर काम करता है। मैं चुनौती देता हूं कि आप इस तरह से सार्वजनिक रूप से शिकायत करने के बजाय अधिक सुरुचिपूर्ण उत्तर के साथ आएं।
डेविड स्पेक्टर

वास्तव में मैंने थैंक्यू कहा, और आपको आलोचना दी, आपने वह लिया और कुछ वापस लिखने का फैसला किया, अगर हम कार्यात्मक तरीकों के साथ शुरू करने जा रहे हैं, जैसे कि प्रोटोटाइपेड जंजीर के तरीकों की तुलना में प्रदर्शन करने के लिए, तो हमें कुछ सरल होना चाहिए: जेएसफल्ड .net / shannonhochkins / xsm9j610 / 21
शैनन होच्किन्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.