আপনি কীভাবে একটি নিয়মিত অভিব্যক্তিতে পরিবর্তনশীল ব্যবহার করবেন?


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') করতে পারেন বা আপনি যদি হেক্স নম্বর চান, আপনি দশমিক থেকে হেক্সে রূপান্তর করতে পার্সেন্ট ('' + মাইনিম্বার, 16) করতে পারেন।
এরিক ওয়ান্ডেলিন

29
প্রশ্নটি পরামর্শ দেয় যে RegEx কেবলমাত্র একটি ধ্রুবক স্ট্রিং প্রতিস্থাপন করতে ব্যবহৃত হয়। সুতরাং এটির উত্তরটি ভুল কারণ এটি স্ট্রিংয়ে RegEx মেটা অক্ষর ধারণ করে ব্যর্থ হবে।
দুঃখজনকভাবে

16
একটি ভেরিয়েবল পাস করার একটি উদাহরণ এটি একটি ভাল উত্তর করতে পারে। আমি এটি পড়ার পরেও লড়াই করছি।
হংস

3
@ জোনাথসউইন্নি: /আপনি যদি স্ট্রিং থেকে রেজেক্স তৈরি করেন তবে এর কোনও বিশেষ অর্থ নেই, সুতরাং আপনার এড়াতে হবে না। /\/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
আপনি কি জানেন যে প্রতিস্থাপনের জন্য প্রথম প্যারামিটারটি স্বাভাবিক স্ট্রিং হতে পারে এবং একটি রেজিপ্সেপ হতে হবে না? str1 = "।"; সতর্কতা ("প্যাটার্ন মেলানো।"। প্রতিস্থাপন (str1, "স্ট্রিং"));
কিছু

@ কিছু: অবশ্যই কারণ উপরের উদাহরণটি তুচ্ছ। যখন আপনাকে নিয়মিত স্ট্রিংয়ের সাথে মিলিত কোনও প্যাটার্নটি সন্ধান করতে বা প্রতিস্থাপন করতে হবে, উদাহরণস্বরূপ, স্ট্রিংম্যাচ (নতুন রেজিপ্স্প ("https?: //" + RegExp.escape (myDomainName)) করুন, এটি বিরক্তিকর যে পালানোর কাজটি অন্তর্নির্মিত নয়
গ্রেসনোটস

(অব্যাহত) প্লাস, আপেল জে সি গ্রুবসের একটি বিশ্বব্যাপী প্রতিস্থাপন প্রয়োজন; স্ট্রিং.রেপ্লেস (স্ট্রিং, স্ট্রিং) সহ বিশ্বব্যাপী প্রতিস্থাপন কার্যকর করা বড় ইনপুটটির জন্য ধীর হতে পারে। আমি কেবল বলছি, শীর্ষ দুটি সমাধানগুলি বগি এবং নির্দিষ্ট ইনপুটটিতে অপ্রত্যাশিত ব্যর্থ হবে।
গ্রেসোটস

4
বিকাশকারী.মোজিলা.আর.ইন- ইউএস -/ ডকস / জাভাস্ক্রিপ্ট / গুয়াইড /… একই ধরণের ফাংশন সরবরাহ করে তবে সেগুলি বাদ দেয় এবং অন্তর্ভুক্ত করে =!:/
chbrown

8
সঠিক শব্দটি "উদ্ধৃতি", "উদ্ধৃতি" নয়। সবে বিটিডব্লিউ।
লরেন্স ডল

118

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

সর্বদা হিসাবে: আপনার দরকার না থাকলে রেজেেক্স ব্যবহার করবেন না। সরল স্ট্রিং প্রতিস্থাপনের জন্য, প্রতিমাটি হ'ল:

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

তারপরে আপনাকে গ্রেসনোটসের উত্তরে উল্লিখিত উদ্ধৃতি সংক্রান্ত সমস্যাগুলি নিয়ে চিন্তা করার দরকার নেই।


11
এবং আপনি কি মাপলেন যে এটি রেজেক্সের চেয়ে দ্রুত?
মিতার

3
এটি পছন্দনীয় বলে মনে হয়, বিশেষত যখন 'বিশেষ রেজেেক্স চরিত্রগুলির সাথে মেলানোর প্রয়োজন হয়' '
ক্রাইস

1
আহ ... বিভাজনও খুব একটা রেজিএক্সপেক্ট নেয় না; যদি তা হয়, তবে তা কি একই সমস্যা সৃষ্টি করবে না? যাইহোক ... .স্প্লিট ()। যোগদান () কিছু প্ল্যাটফর্মের উপর ধীর হতে পারে, কারণ এটি দুটি ক্রিয়াকলাপ,।। স্থান () একটি অপারেশন এবং অনুকূলিত হতে পারে।

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.

ধন্যবাদ! (উদাহরণস্বরূপ, rxটেম্পলেট স্ট্রিংগুলির মাধ্যমে আপনার কেবল ইমাস / স্টাইল ইন্টারপোলেশন দ্বারা স্পষ্টভাবে উত্তর ।)
সাম বুসালিস

34

যে কেউ ম্যাচের পদ্ধতির সাথে ভেরিয়েবল ব্যবহার করতে দেখছেন , এটি আমার পক্ষে কাজ করেছে

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


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

আমি এই উত্তরটি পছন্দ করি কারণ এটি অতিরিক্ত (& অর্থহীন) পরিবর্তনশীল তৈরি করে না।
উইক

14

আপনি রেগুলার এক্সপ্রেশন পরিবর্তনশীল নির্মাণ করতে চান এবং এই সঠিক solutuion ব্যবহার করা new RegExp(string)কন্সট্রাকটর। নির্মাণকারীর জন্য বিশেষ অক্ষরগুলিকে আক্ষরিক আচরণ করতে, আপনাকে অবশ্যই এগুলি থেকে বাঁচতে হবে। JQuery UI এর একটি অন্তর্নির্মিত ফাংশন রয়েছে যা স্বয়ংসম্পূর্ণ উইজেট নামে পরিচিত $.ui.autocomplete.escapeRegex:

[...] আপনি অন্তর্নির্মিত $.ui.autocomplete.escapeRegexফাংশনটি ব্যবহার করতে পারেন । এটি একটি একক স্ট্রিং আর্গুমেন্ট নেবে এবং ফলাফলটিকে পাসে সুরক্ষিত করে সমস্ত রেজেক্স অক্ষরগুলি এড়িয়ে যাবে 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 গুগলের ফলাফল .... যদিও কফি কেবলমাত্র জাভাস্ক্রিপ্টে অনেকগুলি অক্ষর মুছে ফেলেছে ...;)

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!"

কেন ডাউনটা? coffeescript - এটি- এর নিজস্ব নির্দিষ্ট বাক্য গঠন সহ জাভাস্ক্রিপ্ট।
আগ্রহী

robot.name=hubotজাভাস্ক্রিপ্ট নয়।
কোডপ্লেব

3

আপনি যখন গতিশীলভাবে তৈরি RegExp গুলি তৈরি করতে পারেন (এই প্রশ্নের অন্যান্য প্রতিক্রিয়া অনুসারে), আমি আমার অনুরূপ অনুরূপ একটি পোস্ট থেকে প্রতিধ্বনিত করব : স্ট্রিং.রেপ্লেস () এর কার্যকরী রূপটি অত্যন্ত কার্যকর এবং অনেক ক্ষেত্রে এর প্রয়োজনকে হ্রাস করে গতিশীলভাবে তৈরি RegExp অবজেক্ট। (যা এক ধরণের ব্যথার কারণ হিসাবে আপনাকে স্ল্যাশ / [এজেড] + / রিজএক্সপেট আক্ষরিক ফর্ম্যাটটি ব্যবহার না করে স্ট্রিং হিসাবে 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");

যেখানে 'ওলরেয়ার' হ'ল মূল রেজিপ্সপ যা আমি একটি ভেরিয়েবল সন্নিবেশ করতে চাই সেখানে 'xx' হ'ল সেই পরিবর্তনশীল / ওরফে / ফাংশনের স্থানধারক, এবং '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 এ সেট করা by আরও প্রতিস্থাপন ফাংশন। আমার ক্ষেত্রে আমি জ্যাকুরি ব্যবহার করছি, আপনি এটি কেবল জাভাস্ক্রিপ্ট দ্বারাও করতে পারেন।

জাভাস্ক্রিপ্ট কোড:

  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));
  });

এই কোডটি একটি বোতামের অনক্লিক ইভেন্টে রয়েছে, আপনি কল করতে কোনও ফাংশনে এটি রাখতে পারেন।

সুতরাং এখন আপনি প্রতিস্থাপন ফাংশন পরিবর্তনশীল পাস করতে পারেন।



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://burnigniversity.com/php-programming-tips/how-to-use-a-variable-in-replace-function-of- জাভাস্ক্রিপ্ট / এ একটি ভাল ব্যাখ্যা পেয়েছি

সহজ উত্তরটি হ'ল:

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

সমাধানের গুরুত্বপূর্ণ অংশটি এখানে পাওয়া গেল

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.