आप एक नियमित अभिव्यक्ति में एक चर का उपयोग कैसे करते हैं?


1377

मैं String.replaceAll()जावास्क्रिप्ट में एक विधि बनाना चाहूंगा और मैं सोच रहा हूं कि एक रेक्सक्स का उपयोग करना इसे करने के लिए सबसे कठिन तरीका होगा। हालाँकि, मैं यह पता नहीं लगा सकता कि कैसे एक चर को एक रेगेक्स में पास किया जाए। मैं यह पहले से ही जो की सभी आवृत्तियों का स्थान ले लेगा कर सकते हैं "B"के साथ "A"

"ABABAB".replace(/B/g, "A");

लेकिन मैं ऐसा कुछ करना चाहता हूं:

String.prototype.replaceAll = function(replaceThis, withThis) {
    this.replace(/replaceThis/g, withThis);
};

लेकिन जाहिर है कि यह केवल पाठ की जगह लेगा "replaceThis"... तो मैं इस चर को अपने रेगेक्स स्ट्रिंग में कैसे पास करूं?


9
ध्यान दें कि हम वर्तमान में जावास्क्रिप्ट में इस कार्यक्षमता को जोड़ने पर काम कर रहे हैं यदि आपके पास इस बारे में एक राय है तो कृपया चर्चा में शामिल हों।
बेंजामिन ग्रुएनबाम

जवाबों:


1838

/regex/gसिंटैक्स का उपयोग करने के बजाय , आप एक नया RegExp ऑब्जेक्ट का निर्माण कर सकते हैं :

var replace = "regex";
var re = new RegExp(replace,"g");

आप इस तरह से रेगेक्स ऑब्जेक्ट्स को गतिशील रूप से बना सकते हैं। तब आप करेंगे:

"mystring".replace(re, "newstring");

272
यदि आपको अभिव्यक्ति का उपयोग करने की आवश्यकता है /\/word\:\w*$/, तो अपने बैकस्लैश से बचना सुनिश्चित करें new RegExp( '\\/word\\:\\w*$' ):।
जोनाथन स्विनी

2
@ ग्रेविटीबॉय आप कर सकते हैं ('' + myNumber) .replace (/ 10 / g, 'a') या यदि आप हेक्स संख्या चाहते हैं, तो आप दशमलव से हेक्स में बदलने के लिए parseInt ('' + myNumber, 16) कर सकते हैं।
एरिक वेंडेलिन

29
प्रश्न बताता है कि RegEx का उपयोग केवल एक निरंतर स्ट्रिंग प्रतिस्थापन करने के लिए किया जाता है। तो यह उत्तर गलत है क्योंकि यह विफल होगा यदि स्ट्रिंग में RegEx मेटा वर्ण शामिल हैं। दुख की बात यह है कि यह उच्च मतदान है, कई सिरदर्द बना देगा ...
ड्रोन

16
इस चर का एक उदाहरण यह एक अच्छा जवाब होगा। मैं इसे पढ़ने के बाद भी संघर्ष कर रहा हूं।
हंस

3
@JonathanSwinney: /इसका कोई विशेष अर्थ नहीं है यदि आप स्ट्रिंग से रेगेक्स का निर्माण करते हैं, तो आपको इससे बचने की आवश्यकता नहीं है। /\/word\:\w*$/होना चाहिएnew RegExp('/word\\:\\w*$')
दाविद होरवथ

211

जैसा कि एरिक वेंडेलिन ने उल्लेख किया है, आप कुछ इस तरह कर सकते हैं:

str1 = "pattern"
var re = new RegExp(str1, "g");
"pattern matching .".replace(re, "regex");

इससे पैदावार होती है "regex matching ."। हालाँकि, यह विफल होगा यदि str1 है "."। आप इस परिणाम की अपेक्षा करेंगे, "pattern matching regex"इस अवधि की जगह "regex", लेकिन यह हो जाएगा ...

regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex

इसका कारण यह है, हालांकि "."एक स्ट्रिंग है, RegExp कंस्ट्रक्टर में यह अभी भी एक नियमित अभिव्यक्ति के रूप में व्याख्या की जाती है, जिसका अर्थ है किसी भी गैर-लाइन-ब्रेक चरित्र, जिसका अर्थ है स्ट्रिंग में प्रत्येक वर्ण। इस प्रयोजन के लिए, निम्नलिखित कार्य उपयोगी हो सकते हैं:

 RegExp.quote = function(str) {
     return str.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
 };

तो आप कर सकते हैं:

str1 = "."
var re = new RegExp(RegExp.quote(str1), "g");
"pattern matching .".replace(re, "regex");

उपज "pattern matching regex"


4
आप जानते हैं कि बदलने के लिए पहला पैरामीटर एक सामान्य स्ट्रिंग हो सकता है और एक regexp होना जरूरी नहीं है? str1 = ";" चेतावनी ("पैटर्न मिलान"। प्रतिस्थापित करें (str1, "string"));
कुछ

@ कुछ: बेशक। ऐसा इसलिए है क्योंकि उपरोक्त उदाहरण तुच्छ है। जब आपको एक नियमित स्ट्रिंग के साथ संयुक्त पैटर्न को खोजने या बदलने की आवश्यकता होती है, तो str.match करें (उदाहरण के लिए new RegExp ("https:? //" + RegExp.escape (myDomainName)), यह पलायन कार्य है कि कष्टप्रद है। में नहीं बनाया गया था।
Gracenotes

(जारी) प्लस, स्पष्ट जेसी ग्रब्स को वैश्विक प्रतिस्थापन की आवश्यकता थी; String.replace (String, String) के साथ वैश्विक प्रतिस्थापन को लागू करना बड़े इनपुट के लिए धीमा हो सकता है। मैं बस कह रहा हूं, शीर्ष दो समाधान छोटी गाड़ी हैं, और कुछ इनपुट पर अप्रत्याशित रूप से विफल हो जाएंगे।
Gracenotes

4
developer.mozilla.org/en-US/docs/JavaScript/Guide/… एक समान फ़ंक्शन प्रदान करता है, लेकिन वे शामिल नहीं हैं -, और शामिल हैं =!:/
चब्रॉन

8
सही शब्द "बच" है, "बोली" नहीं। बस बीटीडब्ल्यू।
लॉरेंस डॉल

118

"ABABAB".replace(/B/g, "A");

हमेशा की तरह: regex का उपयोग न करें जब तक कि आपके पास न हो। एक साधारण स्ट्रिंग की जगह के लिए, मुहावरा है:

'ABABAB'.split('B').join('A')

फिर आपको ग्रेकोनोट्स के उत्तर में उल्लिखित मुद्दों के बारे में चिंता करने की ज़रूरत नहीं है।


11
और क्या आपने मापा है कि यह रेगेक्स से अधिक तेज है?
मितर

3
यह बेहतर लगता है, खासकर जब 'जैसे विशेष रेगेक्स पात्रों पर मिलान करने की आवश्यकता होती है।'
क्रीज

1
उम्म ... एक RegExp भी विभाजित नहीं करता है; यदि हां, तो क्या यह एक ही समस्या का कारण नहीं होगा? वैसे भी ... .plit ()। Join () कुछ प्लेटफार्मों पर धीमा हो सकता है, क्योंकि यह दो ऑपरेशन हैं, जबकि .replace () एक ऑपरेशन है और इसे अनुकूलित किया जा सकता है।

5
@ PacMan--: दोनों splitऔर replaceया तो एक स्ट्रिंग या एक ले जा सकते हैं RegExpवस्तु। जो समस्या replaceहै वह splitयह नहीं है कि जब आप एक स्ट्रिंग का उपयोग करते हैं तो आपको केवल एक ही प्रतिस्थापन मिलता है।
बॉबीस


38

यदि आप सभी घटनाएँ ( g) प्राप्त करना चाहते हैं , तो असंवेदनशील रहें ( i), और सीमाओं का उपयोग करें ताकि यह दूसरे शब्द के भीतर एक शब्द न हो ( \\b):

re = new RegExp(`\\b${replaceThis}\\b`, 'gi');

उदाहरण:

let inputString = "I'm John, or johnny, but I prefer john.";
let replaceThis = "John";
let re = new RegExp(`\\b${replaceThis}\\b`, 'gi');
console.log(inputString.replace(re, "Jack")); // I'm Jack, or johnny, but I prefer Jack.

धन्यवाद! (afaict, तुम्हारा एकमात्र उत्तर स्पष्ट रूप से Emacs / rx
-स्टाइल

34

मैच विधि के साथ चर का उपयोग करने की तलाश में किसी के लिए , यह मेरे लिए काम किया

var alpha = 'fig';
'food fight'.match(alpha + 'ht')[0]; // fight


20
this.replace( new RegExp( replaceThis, 'g' ), withThis );

मुझे यह उत्तर पसंद है क्योंकि यह अतिरिक्त (और व्यर्थ) चर नहीं बनाता है।
विक

14

आप नियमित रूप से अभिव्यक्ति का निर्माण गतिशील रूप से करना चाहते हैं और इसके लिए new RegExp(string)कंस्ट्रक्टर का सही उपयोग करना है । निर्माणकर्ता के लिए विशेष वर्णों का अक्षरशः व्यवहार करने के लिए , आपको उनसे बचना चाहिए। JQuery यूआई स्वतः पूर्ण विजेट में एक अंतर्निहित फ़ंक्शन है जिसे कहा जाता है $.ui.autocomplete.escapeRegex:

[...] आप अंतर्निहित $.ui.autocomplete.escapeRegexफ़ंक्शन का उपयोग कर सकते हैं । यह एक एकल स्ट्रिंग तर्क लेगा और सभी regex वर्णों से बच जाएगा, जिससे परिणाम पास करना सुरक्षित होगा new RegExp()

यदि आप jQuery UI का उपयोग कर रहे हैं, तो आप उस फ़ंक्शन का उपयोग कर सकते हैं, या स्रोत से इसकी परिभाषा को कॉपी कर सकते हैं :

function escapeRegex( value ) {
    return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
}

और इसे इस तरह से उपयोग करें:

"[z-a][z-a][z-a]".replace(new RegExp(escapeRegex("[z-a]"), "g"), "[a-z]");
//            escapeRegex("[z-a]")       -> "\[z\-a\]"
// new RegExp(escapeRegex("[z-a]"), "g") -> /\[z\-a\]/g
// end result                            -> "[a-z][a-z][a-z]"

9
String.prototype.replaceAll = function (replaceThis, withThis) {
   var re = new RegExp(replaceThis,"g"); 
   return this.replace(re, withThis);
};
var aa = "abab54..aba".replaceAll("\\.", "v");

इस उपकरण के साथ परीक्षण करें


5
String.prototype.replaceAll = function(a, b) {
    return this.replace(new RegExp(a.replace(/([.?*+^$[\]\\(){}|-])/ig, "\\$1"), 'ig'), b)
}

इसका परीक्षण करें जैसे:

var whatever = 'Some [b]random[/b] text in a [b]sentence.[/b]'

console.log(whatever.replaceAll("[", "<").replaceAll("]", ">"))

4

यहां एक और प्रतिस्थापन लागू किया गया है:

    String.prototype.replaceAll = function (stringToFind, stringToReplace) {
        if ( stringToFind == stringToReplace) return this;
        var temp = this;
        var index = temp.indexOf(stringToFind);
        while (index != -1) {
            temp = temp.replace(stringToFind, stringToReplace);
            index = temp.indexOf(stringToFind);
        }
        return temp;
    };

4

और स्टीवन पेनी के जवाब का कॉफ़ीस्क्रिप्ट संस्करण, क्योंकि यह # 2 Google परिणाम है .... भले ही कॉफी केवल बहुत सारे वर्णों के साथ जावास्क्रिप्ट हटा दिया गया हो ...;)

baz = "foo"
filter = new RegExp(baz + "d")
"food fight".match(filter)[0] // food

और मेरे विशेष मामले में

robot.name=hubot
filter = new RegExp(robot.name)
if msg.match.input.match(filter)
  console.log "True!"

एक नीचता क्यों? कॉफिसस्क्रिप्ट -आईएस- जावास्क्रिप्ट के साथ इसका अपना विशिष्ट सिंटैक्स है।
उत्सुक

robot.name=hubotजावास्क्रिप्ट नहीं है
कोडप्लब

3

जब आप डायनामिक रूप से बनाए गए RegExp's (इस प्रश्न के अन्य उत्तरों के अनुसार) कर सकते हैं, तो मैं अपनी टिप्पणी एक समान पोस्ट से गूंजूंगा : String.replace () का कार्यात्मक रूप अत्यंत उपयोगी है और कई मामलों में इसकी आवश्यकता कम कर देता है गतिशील रूप से बनाई गई RegExp ऑब्जेक्ट। (जो एक तरह का दर्द होता है, क्योंकि आपको स्लैश / [AZ] + / rexxp शाब्दिक प्रारूप का उपयोग करने के बजाय एक स्ट्रिंग के रूप में RegExp कंस्ट्रक्टर को इनपुट व्यक्त करना होगा]


3

एक नियमित अभिव्यक्ति में एक चर / उपनाम / फ़ंक्शन डालने की मेरी आवश्यकता को पूरा करने के लिए, यह वही है जो मैं लेकर आया हूं:

oldre = /xx\(""\)/;
function newre(e){
    return RegExp(e.toString().replace(/\//g,"").replace(/xx/g, yy), "g")
};

String.prototype.replaceAll = this.replace(newre(oldre), "withThis");

जहाँ 'पुराना' मूल रीजैक्स है जिसे मैं एक चर सम्मिलित करना चाहता हूँ, 'चर' उस चर / उपनाम / कार्य के लिए प्लेसहोल्डर है, और 'yy' वास्तविक चर नाम, उपनाम या फ़ंक्शन है।


2

यदि $ 1 आपके साथ काम न करे तो आप इसका उपयोग कर सकते हैं

var pattern = new RegExp("amman","i");
"abc Amman efg".replace(pattern,"<b>"+"abc Amman efg".match(pattern)[0]+"</b>");

1

आप हमेशा indexOfबार-बार उपयोग कर सकते हैं :

String.prototype.replaceAll = function(substring, replacement) {
    var result = '';
    var lastIndex = 0;

    while(true) {
        var index = this.indexOf(substring, lastIndex);
        if(index === -1) break;
        result += this.substring(lastIndex, index) + replacement;
        lastIndex = index + substring.length;
    }

    return result + this.substring(lastIndex);
};

जब प्रतिस्थापन मैच होता है तो यह एक अनंत लूप में नहीं जाता है।


1

आपका समाधान यहां है:

एक चर को नियमित अभिव्यक्ति के लिए पास करें।

एक जो मैंने लागू किया है वह एक टेक्स्ट फ़ील्ड से मान लेने के लिए है, जिसे आप बदलना चाहते हैं और दूसरा "टेक्स्ट फ़ील्ड के साथ बदलें" है, टेक्स्ट-फ़ील्ड से एक वेरिएबल में वैल्यू प्राप्त करना और वैरिएबल को RegExp में सेट करना आगे बदलने के लिए कार्य करते हैं। मेरे मामले में मैं Jquery का उपयोग कर रहा हूं, आप इसे केवल जावास्क्रिप्ट द्वारा भी कर सकते हैं।

जावास्क्रिप्ट कोड:

  var replace =document.getElementById("replace}"); // getting a value from a text field with I want to replace
  var replace_with = document.getElementById("with"); //Getting the value from another text fields with which I want to replace another string.

  var sRegExInput = new RegExp(replace, "g");    
  $("body").children().each(function() {
    $(this).html($(this).html().replace(sRegExInput,replace_with));
  });

यह कोड एक बटन की ऑनक्लिक घटना पर है, आप इसे कॉल करने के लिए फ़ंक्शन में रख सकते हैं।

इसलिए अब आप बदले हुए फंक्शन में वेरिएबल पास कर सकते हैं।


आपके प्रतिस्थापन_ के चर में DOM तत्व नहीं होगा जो स्वयं
बेन टालिडोरोस

1

यह सेल्फ कॉलिंग फ़ंक्शन एक इंडेक्स का उपयोग करके replacerItems पर पुनरावृति करेगा, और प्रत्येक पास से स्ट्रिंग पर विश्व स्तर पर replacerItems [इंडेक्स] को बदल देगा।

  const replacerItems = ["a", "b", "c"];    

    function replacer(str, index){
          const item = replacerItems[index];
          const regex = new RegExp(`[${item}]`, "g");
          const newStr = str.replace(regex, "z");
          if (index < replacerItems.length - 1) {
            return replacer(newStr, index + 1);
          }
          return newStr;
    }

// console.log(replacer('abcdefg', 0)) will output 'zzzdefg'

0

इनमें से कोई भी उत्तर मेरे लिए स्पष्ट नहीं था। मुझे अंततः http://burnignorance.com/php-programming-tips/how-to-use-a-variable-in-replace-function-of-javascript/ पर एक अच्छी व्याख्या मिली।

सरल उत्तर है:

var search_term = new RegExp(search_term, "g");    
text = text.replace(search_term, replace_term);

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

$("button").click(function() {
  Find_and_replace("Lorem", "Chocolate");
  Find_and_replace("ipsum", "ice-cream");
});

function Find_and_replace(search_term, replace_term) {
  text = $("textbox").html();
  var search_term = new RegExp(search_term, "g");
  text = text.replace(search_term, replace_term);
  $("textbox").html(text);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textbox>
  Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum
</textbox>
<button>Click me</button>


1
आप एक क्लोजर वेरिएबल को ओवरराइट कर रहे हैं, varयहाँ उपयोग करने की कोई आवश्यकता नहीं है। इसके अलावा, यदि आप गुजरते हैं \bया \1यह टूट जाएगा।
साइबरएप

0

नियमित अभिव्यक्ति के बिना कई प्रतिस्थापन के लिए मैं निम्नलिखित के साथ गया:

      let str = "I am a cat man. I like cats";
      let find = "cat";
      let replace = "dog";


      // Count how many occurrences there are of the string to find 
      // inside the str to be examined.
      let findCount = str.split(find).length - 1;

      let loopCount = 0;

      while (loopCount < findCount) 
      {
        str = str.replace(find, replace);
        loopCount = loopCount + 1;
      }  

      console.log(str);
      // I am a dog man. I like dogs

समाधान का महत्वपूर्ण हिस्सा यहां पाया गया था

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