कई स्ट्रिंग्स को कई अन्य स्ट्रिंग्स के साथ बदलें


213

मैं एक स्ट्रिंग में कई शब्दों को कई अन्य शब्दों के साथ बदलने की कोशिश कर रहा हूं। स्ट्रिंग "मेरे पास एक बिल्ली, एक कुत्ता और एक बकरी है।"

हालांकि, यह "मेरे पास एक कुत्ता, एक बकरी और एक बिल्ली" नहीं है, बल्कि यह पैदा करता है कि "मेरे पास एक बिल्ली, एक बिल्ली और एक बिल्ली है"। क्या जावास्क्रिप्ट में एक ही समय में कई अन्य तारों के साथ कई तारों को बदलना संभव है, ताकि सही परिणाम उत्पन्न हो सके?

var str = "I have a cat, a dog, and a goat.";
str = str.replace(/cat/gi, "dog");
str = str.replace(/dog/gi, "goat");
str = str.replace(/goat/gi, "cat");

//this produces "I have a cat, a cat, and a cat"
//but I wanted to produce the string "I have a dog, a goat, and a cat".

मैं कई शब्दों को एक स्ट्रिंग में कई शब्दों के साथ बदलना चाहता हूं, बिना पहले से बदले गए शब्दों को प्रतिस्थापित करना।
एंडरसन ग्रीन

मेरे पास कुछ अलग क्वेरी है, क्या होगा अगर मुझे पता है कि उपयोगकर्ता बिल्ली या कुत्ते या बकरी में प्रवेश करने जा रहा है (यह बेतरतीब ढंग से आ रहा है), लेकिन जब भी यह थोड़े शब्द आएंगे, तो मुझे 'जानवर' के साथ बदलने की आवश्यकता होगी। इस परिदृश्य को कैसे प्राप्त करें
प्रसन्ना सासें

जवाबों:


445

विशिष्ट समाधान

आप प्रत्येक को बदलने के लिए एक फ़ंक्शन का उपयोग कर सकते हैं।

var str = "I have a cat, a dog, and a goat.";
var mapObj = {
   cat:"dog",
   dog:"goat",
   goat:"cat"
};
str = str.replace(/cat|dog|goat/gi, function(matched){
  return mapObj[matched];
});

jsfiddle उदाहरण

इसे सामान्य कर रहा है

यदि आप रेगेक्स को गतिशील रूप से बनाए रखना चाहते हैं और नक्शे में भविष्य के एक्सचेंजों को जोड़ना चाहते हैं, तो आप ऐसा कर सकते हैं

new RegExp(Object.keys(mapObj).join("|"),"gi"); 

रेगेक्स उत्पन्न करने के लिए। तो फिर यह इस तरह दिखेगा

var mapObj = {cat:"dog",dog:"goat",goat:"cat"};

var re = new RegExp(Object.keys(mapObj).join("|"),"gi");
str = str.replace(re, function(matched){
  return mapObj[matched];
});

और किसी भी अधिक प्रतिस्थापन को जोड़ने या बदलने के लिए आप बस मानचित्र को संपादित कर सकते हैं। 

गतिशील रेगेक्स के साथ बेला

इसे पुन: प्रयोज्य बनाना

यदि आप चाहते हैं कि यह एक सामान्य पैटर्न हो, तो आप इसे इस तरह से एक समारोह में खींच सकते हैं

function replaceAll(str,mapObj){
    var re = new RegExp(Object.keys(mapObj).join("|"),"gi");

    return str.replace(re, function(matched){
        return mapObj[matched.toLowerCase()];
    });
}

तो फिर आप बस उस फ़ंक्शन के इच्छित स्ट्रैप और मैप को पास कर सकते हैं और यह परिवर्तित स्ट्रिंग को लौटा देगा।

समारोह के साथ बेला

पुराने ब्राउज़र में Object.keys काम करता है यह सुनिश्चित करने के लिए, MDN या Es5 से एक पॉलीफ़िल जोड़ें


4
मुझे यकीन नहीं है कि मैं इस फ़ंक्शन का उपयोग सभी प्रकार के स्ट्रिंग्स को बदलने के लिए कर सकता हूं, क्योंकि जावास्क्रिप्ट स्ट्रिंग्स में जिन पात्रों की अनुमति है, वे वही नहीं हैं जो जावास्क्रिप्ट आइडेंटिफ़ायर में अनुमत हैं (जैसे कि यहां उपयोग की जाने वाली कुंजियाँ) ।
एंडरसन ग्रीन

2
आप जावास्क्रिप्ट संपत्ति के रूप में एक मनमाना स्ट्रिंग का उपयोग कर सकते हैं। कोई बात नहीं होनी चाहिए। आप बस .ऐसे सभी गुणों के साथ संकेतन का उपयोग नहीं कर सकते । ब्रैकेट नोटेशन किसी भी स्ट्रिंग के साथ काम करता है।
बेन मैककॉर्मिक

2
यह वास्तव में बहुत अच्छा काम करता है। मैं इस समाधान ('विशिष्ट' एक) का उपयोग करके अंग्रेजी संख्या अंकन को यूरोपीय लोगों में बदलने के लिए (24,973.56 से 24.973,56), map={'.': ',', ',': '.'}और रेगेक्स का उपयोग कर रहा हूं /\.|,/g
Sygmoral

5
मैं इस समाधान से प्यार करता हूं, लेकिन मुझे मामले में संवेदनशील कुंजियों का उपयोग return mapObj[matched.toLowerCase()];करने के लिए बस प्रतिस्थापित करना return mapObj[matched];था mapObj
मिशाल मोरविक

2
आप नियमित अभिव्यक्ति के लिए चाबी से बचने के लिए चाहते हो सकता है: Object.keys(mapObj).map(key => key.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')).join('|')इस उत्तर
रोल्स

9

यह इस उदाहरण में आपकी सटीक आवश्यकता को पूरा नहीं कर सकता है, लेकिन मैंने इसे एक सामान्य उपाय के रूप में स्ट्रिंग में कई मापदंडों को बदलने का एक उपयोगी तरीका पाया है। यह मापदंडों के सभी उदाहरणों को बदल देगा, चाहे वे कितनी बार संदर्भित हों:

String.prototype.fmt = function (hash) {
        var string = this, key; for (key in hash) string = string.replace(new RegExp('\\{' + key + '\\}', 'gm'), hash[key]); return string
}

आप इसे निम्नानुसार लागू करेंगे:

var person = '{title} {first} {last}'.fmt({ title: 'Agent', first: 'Jack', last: 'Bauer' });
// person = 'Agent Jack Bauer'

8

फिर से बदलने से रोकने के लिए गिने-चुने वस्तुओं का उपयोग करें। जैसे

let str = "I have a %1, a %2, and a %3";
let pets = ["dog","cat", "goat"];

फिर

str.replace(/%(\d+)/g, (_, n) => pets[+n-1])

यह कैसे काम करता है: -% \ d +% के बाद आने वाली संख्याओं का पता लगाता है। कोष्ठक संख्या पर कब्जा करते हैं।

यह संख्या (एक स्ट्रिंग के रूप में) लैम्बडा फ़ंक्शन के लिए 2 डी पैरामीटर, एन है।

+ N-1 स्ट्रिंग को संख्या में परिवर्तित करता है और फिर पालतू जानवरों के सरणी को अनुक्रमित करने के लिए 1 को घटाया जाता है।

% संख्या को तब सरणी सूचकांक में स्ट्रिंग के साथ बदल दिया जाता है।

/ G के कारण लैम्बडा फ़ंक्शन को प्रत्येक संख्या के साथ बार-बार कॉल किया जाता है, जिसे बाद में सरणी से स्ट्रिंग के साथ बदल दिया जाता है।

आधुनिक जावास्क्रिप्ट में: -

replace_n=(str,...ns)=>str.replace(/%(\d+)/g,(_,n)=>ns[n-1])

दिलचस्प। क्या आप प्रतिस्थापित फ़ंक्शन में तर्क की व्याख्या कर सकते हैं?
एरिक हेपरले - कोडस्लेयर २०१०

5

यह मेरे लिए काम किया:

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

function replaceAll(str, map){
    for(key in map){
        str = str.replaceAll(key, map[key]);
    }
    return str;
}

//testing...
var str = "bat, ball, cat";
var map = {
    'bat' : 'foo',
    'ball' : 'boo',
    'cat' : 'bar'
};
var new = replaceAll(str, map);
//result: "foo, boo, bar"


स्ट्रिंग regex वर्ण शामिल हैं, तो काम नहीं करता है।
रोमेर

"विस्तार न करें ..." के बारे में: मैंने समानता, केस-असंवेदनशील के लिए दो तार की तुलना करने के लिए अपने स्ट्रिंग का विस्तार किया। यह कार्यक्षमता स्ट्रिंग द्वारा प्रदान नहीं की गई है, लेकिन यह किसी दिन हो सकता है, जिससे मेरे एप्लिकेशन टूट सकते हैं। क्या इस तरह के फ़ंक्शन को सुरक्षित रूप से शामिल करने के लिए "उपवर्ग" या "विस्तार" स्ट्रिंग का एक तरीका है, या मुझे बस अपने ऐप लाइब्रेरी के हिस्से के रूप में एक नए दो-तर्क फ़ंक्शन को परिभाषित करना चाहिए?
डेविड स्पेक्टर

4

Array.prototype.reduce () का उपयोग कर :

const arrayOfObjects = [
  { plants: 'men' },
  { smart:'dumb' },
  { peace: 'war' }
]
const sentence = 'plants are smart'

arrayOfObjects.reduce(
  (f, s) => `${f}`.replace(Object.keys(s)[0], s[Object.keys(s)[0]]), sentence
)

// as a reusable function
const replaceManyStr = (obj, sentence) => obj.reduce((f, s) => `${f}`.replace(Object.keys(s)[0], s[Object.keys(s)[0]]), sentence)

const result = replaceManyStr(arrayOfObjects , sentence1)

उदाहरण

// /////////////    1. replacing using reduce and objects

// arrayOfObjects.reduce((f, s) => `${f}`.replace(Object.keys(s)[0], s[Object.keys(s)[0]]), sentence)

// replaces the key in object with its value if found in the sentence
// doesn't break if words aren't found

// Example

const arrayOfObjects = [
  { plants: 'men' },
  { smart:'dumb' },
  { peace: 'war' }
]
const sentence1 = 'plants are smart'
const result1 = arrayOfObjects.reduce((f, s) => `${f}`.replace(Object.keys(s)[0], s[Object.keys(s)[0]]), sentence1)

console.log(result1)

// result1: 
// men are dumb


// Extra: string insertion python style with an array of words and indexes

// usage

// arrayOfWords.reduce((f, s, i) => `${f}`.replace(`{${i}}`, s), sentence)

// where arrayOfWords has words you want to insert in sentence

// Example

// replaces as many words in the sentence as are defined in the arrayOfWords
// use python type {0}, {1} etc notation

// five to replace
const sentence2 = '{0} is {1} and {2} are {3} every {5}'

// but four in array? doesn't break
const words2 = ['man','dumb','plants','smart']

// what happens ?
const result2 = words2.reduce((f, s, i) => `${f}`.replace(`{${i}}`, s), sentence2)

console.log(result2)

// result2: 
// man is dumb and plants are smart every {5}

// replaces as many words as are defined in the array
// three to replace
const sentence3 = '{0} is {1} and {2}'

// but five in array
const words3 = ['man','dumb','plant','smart']

// what happens ? doesn't break
const result3 = words3.reduce((f, s, i) => `${f}`.replace(`{${i}}`, s), sentence3)

console.log(result3)

// result3: 
// man is dumb and plants


सबसे बढ़िया उत्तर। लेकिन क्या ${f}संचय मूल्य के लिए च के बजाय उपयोग करने का एक कारण है ?
डेविड स्पेक्टर

1
यदि आप चाहते हैं कि दिए गए सभी तारों को बदला जाए, तो न केवल पहले, जी ध्वज जोड़ें: "const result1 = arrayOfObjects.reduce ((f, s) => ${f}.replace (नया RegExp (Object.keys) 0], 'g'), s [Object.keys (s) [0]], वाक्य 1) ​​"
डेविड स्पेक्टर

2

बस अगर कोई व्यक्ति सोच रहा है कि मूल पोस्टर का समाधान क्यों काम नहीं कर रहा है:

var str = "I have a cat, a dog, and a goat.";

str = str.replace(/cat/gi, "dog");
// now str = "I have a dog, a dog, and a goat."

str = str.replace(/dog/gi, "goat");
// now str = "I have a goat, a goat, and a goat."

str = str.replace(/goat/gi, "cat");
// now str = "I have a cat, a cat, and a cat."

हा हा ... अच्छी तरह से विश्लेषण किया ... थम्सअप
दीपा एमजी

1

उपयोगकर्ता नियमित कार्य को बदलने के लिए पैटर्न को परिभाषित करता है और फिर इनपुट स्ट्रिंग पर काम करने के लिए प्रतिस्थापित फ़ंक्शन का उपयोग करता है,

var i = new RegExp('"{','g'),
    j = new RegExp('}"','g'),
    k = data.replace(i,'{').replace(j,'}');

यदि आप स्किप के बारे में नहीं जानते हैं, लेकिन यह गलत उत्तर नहीं है। मेरा मामला "{" a ": 1," b ": 2}" जैसे कि वहाँ है, मैं उपरोक्त तरीके को बदलने के लिए उपयोग किया जाता है। यदि यह दूसरों की सहायता करता है यदि वे अन्य उत्तर चाहते हैं तो केवल आपके लिए नहीं है। @Carr
KARTHIKEYAN.A

फिर, आपने सिर्फ एक व्यर्थ उत्तर दिया, जो आप करते हैं वह प्रश्नकर्ता पहले से ही कर सकता है प्रश्न में, यह उत्तर लोगों को गुमराह करेगा कि वे नया सोच सकते हैं और RegExpवस्तु का उपयोग कर समस्या का समाधान कर सकते हैं
Carr

इस मामले में, आपके पास प्रश्नकर्ता के प्रश्न के रूप में अभी भी वही समस्या है जब आप करते हैंvar i = new RegExp('}','g'), j = new RegExp('{','g'), k = data.replace(i,'{').replace(j,'}');
Carr

1

मेरे प्रतिस्थापन-एक बार पैकेज के साथ, आप निम्न कार्य कर सकते हैं:

const replaceOnce = require('replace-once')

var str = 'I have a cat, a dog, and a goat.'
var find = ['cat', 'dog', 'goat']
var replace = ['dog', 'goat', 'cat']
replaceOnce(str, find, replace, 'gi')
//=> 'I have a dog, a goat, and a cat.'

यह पैकेज अद्भुत है :) जैसा कि मैंने उम्मीद की थी, ठीक काम करता है
विष्णु प्रसाद

1
    var str = "I have a cat, a dog, and a goat.";

    str = str.replace(/goat/i, "cat");
    // now str = "I have a cat, a dog, and a cat."

    str = str.replace(/dog/i, "goat");
    // now str = "I have a cat, a goat, and a cat."

    str = str.replace(/cat/i, "dog");
    // now str = "I have a dog, a goat, and a cat."

3
ओपी ने पूछा "क्या एक ही समय में कई तारों को कई अन्य तारों के साथ बदलना संभव है "। यह तीन अलग-अलग चरण हैं।
LittleBobbyTables - Au Revoir

1

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

var obj = {
  'firstname': 'John',
  'lastname': 'Doe'
}

var text = "My firstname is {firstname} and my lastname is {lastname}"

console.log(mutliStringReplace(obj,text))

function mutliStringReplace(object, string) {
      var val = string
      var entries = Object.entries(object);
      entries.forEach((para)=> {
          var find = '{' + para[0] + '}'
          var regExp = new RegExp(find,'g')
       val = val.replace(regExp, para[1])
    })
  return val;
}


0
String.prototype.replaceSome = function() {
    var replaceWith = Array.prototype.pop.apply(arguments),
        i = 0,
        r = this,
        l = arguments.length;
    for (;i<l;i++) {
        r = r.replace(arguments[i],replaceWith);
    }
    return r;
}

/ * स्ट्रिंग्स के लिए रीप्लेससम मेथड, जैसा कि हम चाहते हैं, बहुत सारे तर्क जो हम चाहते हैं और उनमें से सभी को अंतिम तर्क के साथ बदल देता है जिसे हमने निर्दिष्ट किया था 2013 कॉपीरेट्स के लिए सहेजा गया: मैक्स अहमद यह एक उदाहरण है:

var string = "[hello i want to 'replace x' with eat]";
var replaced = string.replaceSome("]","[","'replace x' with","");
document.write(string + "<br>" + replaced); // returns hello i want to eat (without brackets)

* /

jsFiddle: http://jsfiddle.net/CPj89/


0
<!DOCTYPE html>
<html>
<body>



<p id="demo">Mr Blue 
has a           blue house and a blue car.</p>

<button onclick="myFunction()">Try it</button>

<script>
function myFunction() {
    var str = document.getElementById("demo").innerHTML;
    var res = str.replace(/\n| |car/gi, function myFunction(x){

if(x=='\n'){return x='<br>';}
if(x==' '){return x='&nbsp';}
if(x=='car'){return x='BMW'}
else{return x;}//must need



});

    document.getElementById("demo").innerHTML = res;
}
</script>

</body>
</html>

0

मैंने यह npm पैकेज stringinject लिखा है https://www.npmjs.com/package/stringinject जो आपको निम्नलिखित कार्य करने की अनुमति देता है

var string = stringInject("this is a {0} string for {1}", ["test", "stringInject"]);

जो सरणी आइटम के साथ {0} और {1} को प्रतिस्थापित करेगा और निम्नलिखित स्ट्रिंग लौटाएगा

"this is a test string for stringInject"

या आप प्लेसहोल्डर्स को ऑब्जेक्ट कीज़ और वैल्यूज़ जैसे रिप्लेस कर सकते हैं:

var str = stringInject("My username is {username} on {platform}", { username: "tjcafferkey", platform: "GitHub" });

"My username is tjcafferkey on Github" 

0

आप इस उद्देश्य के लिए https://www.npmjs.com/package/union-replacer का उपयोग कर सकते हैं । यह मूल रूप से एक string.replace(regexp, ...)प्रतिरूप है, जो पूरी शक्ति का संरक्षण करते हुए एक के बाद एक कई बदलावों को अंजाम देता है string.replace(...)

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

ऊपर दिए गए समाधान हालांकि सटीक स्ट्रिंग प्रतिस्थापन के लिए पर्याप्त हैं।


-1

मैंने @BenMcCormicks पर थोड़ा विस्तार किया। उनके लिए नियमित रूप से स्ट्रिंग्स के लिए काम किया जाता था, लेकिन अगर मैं पात्रों या वाइल्डकार्ड से बच गया था तो नहीं। यहाँ मैंने क्या किया है

str = "[curl] 6: blah blah 234433 blah blah";
mapObj = {'\\[curl] *': '', '\\d: *': ''};


function replaceAll (str, mapObj) {

    var arr = Object.keys(mapObj),
        re;

    $.each(arr, function (key, value) {
        re = new RegExp(value, "g");
        str = str.replace(re, function (matched) {
            return mapObj[value];
        });
    });

    return str;

}
replaceAll(str, mapObj)

रिटर्न "blah blah 234433 blah blah"

इस तरह यह मेपबज में कुंजी से मेल खाएगा और मिलान किए गए शब्द से नहीं


// बेकार: प्रतिस्थापन ("मेरे पास एक बिल्ली, एक कुत्ता और एक बकरी है।", {बिल्ली: "कुत्ता", कुत्ता: "बकरी", बकरी: "बिल्ली"}) // उत्पादन: "मेरे पास एक बिल्ली है , एक बिल्ली और एक बिल्ली। "
डेवोन

-3

Jquery के साथ समाधान (पहले इस फ़ाइल को शामिल करें): कई तार को कई अन्य तारों से बदलें:

var replacetext = {
    "abc": "123",
    "def": "456"
    "ghi": "789"
};

$.each(replacetext, function(txtorig, txtnew) {
    $(".eng-to-urd").each(function() {
        $(this).text($(this).text().replace(txtorig, txtnew));
    });
});

क्या इस समाधान के लिए JQuery की आवश्यकता है?
एंडरसन ग्रीन

जावास्क्रिप्ट टैग को प्रश्न में जोड़ा गया है, और जावास्क्रिप्ट जावास्क्रिप्ट का एक संग्रह है।
सुपर मॉडल

2
@ सुपर हम्म javascript tag added in question, and jquery is a libarary of javascript.कि तर्क बंद है, यह अन्य तरीके से गोल होना चाहिए, और सिर्फ एक हेड अप भी होना चाहिए - जावास्क्रिप्ट टैग जानकारी से: " जब तक एक फ्रेमवर्क / लाइब्रेरी के लिए एक और टैग भी शामिल नहीं होता है, शुद्ध जावास्क्रिप्ट उत्तर की उम्मीद की जाती है। "
ट्रैक्सो

@ एंडर्सन ग्रीन, उपरोक्त स्क्रिप्ट के लिए हाँ jquery की आवश्यकता है।
सुपर मॉडल

@ ट्रैक्सो, अधिकांश वेब अनुप्रयोगों में हम फ्रेमवर्क (बूटस्ट्रैप / गूगल सामग्री) का उपयोग कर रहे हैं। Jquery में सभी आधुनिक ढांचे शामिल हैं। तो, वेब अनुप्रयोगों के लिए jquery आवश्यक वस्तु है।
सुपर मॉडल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.