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




regex (12)

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

সর্বদা হিসাবে: আপনি যদি আছে না regex ব্যবহার করবেন না। একটি সহজ স্ট্রিং প্রতিস্থাপন করার জন্য, idiom হল:

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

তারপরে গ্রেসেনোটসের উত্তরগুলিতে উদ্ধৃত উদ্ধৃতি বিষয়গুলির বিষয়ে আপনাকে চিন্তা করতে হবে না।

আমি জাভাস্ক্রিপ্টে String.replaceAll () পদ্ধতিটি তৈরি করতে চাই এবং আমি মনে করি যে একটি রেজেক্স ব্যবহার করে এটি করার সবচেয়ে বেশি উপায় হবে। যাইহোক, আমি একটি RegEx মধ্যে একটি পরিবর্তনশীল পাস কিভাবে চিন্তা করতে পারবেন না। আমি ইতিমধ্যে এটি করতে পারি যা "B" এর সমস্ত উদাহরণকে "A" দিয়ে প্রতিস্থাপন করবে।

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

কিন্তু আমি এমন কিছু করতে চাই:

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

কিন্তু স্পষ্টতই এটি "প্রতিস্থাপনটি" পাঠ্যটি প্রতিস্থাপিত করবে ... তাই আমি কিভাবে এই পরিবর্তনশীলটি আমার রেজেক্স স্ট্রিং এ প্রেরণ করব?


$ 1 আপনার সাথে কাজ না করলে আপনি এটি ব্যবহার করতে পারেন

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

আপনি নিয়মিত অভিব্যক্তিটি গতিশীলভাবে তৈরি করতে চান এবং এর জন্য সঠিক দ্রাব্যতা 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]"

আপনি সর্বদা 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);
};

প্রতিস্থাপন ম্যাচ রয়েছে যখন এটি একটি অসীম লুপ মধ্যে যেতে না।



একটি নিয়মিত এক্সপ্রেশনতে একটি পরিবর্তনশীল / উদাস / ফাংশন সন্নিবেশ করার জন্য আমার প্রয়োজন পূরণ করার জন্য, আমি যা দিয়ে এসেছি:

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

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

যেখানে 'oldre' মূল regexp হয় যা আমি একটি পরিবর্তনশীল সন্নিবেশ করতে চাই, 'xx' সেই পরিবর্তনশীল / উদাস / ফাংশনের জন্য স্থানধারক এবং 'yy' প্রকৃত পরিবর্তনশীল নাম, উপনাম, বা ফাংশন।


এবং স্টিভেন পেনি এর উত্তরের coffeescript সংস্করণ, এটি # ২ গুগল ফলাফল .... কফি যদি অনেকগুলি অক্ষর বাদ দিয়ে জাভাস্ক্রিপ্ট সরিয়ে দেয় ...;)

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

যখন আপনি গতিশীলভাবে তৈরি রেজেক্স তৈরি করতে পারেন (এই প্রশ্নের অন্যান্য প্রতিক্রিয়া অনুসারে), আমি একই পোস্ট থেকে আমার মন্তব্যটি String.replace() : String.replace() এর কার্যকরী ফর্মটি অত্যন্ত উপকারী এবং অনেক ক্ষেত্রে String.replace() প্রয়োজন হ্রাস করে গতিশীলভাবে তৈরি RegExp বস্তু। (যা একটি ব্যথা 'কারণ, আপনাকে স্ল্যাশ / [AZ] + / regexp আক্ষরিক ফর্ম্যাট ব্যবহার করার পরিবর্তে একটি স্ট্রিং হিসাবে RegExp কন্সট্রকটারে ইনপুট প্রকাশ করতে হবে।


যেমন ইरिक ওয়েেন্ডেলিন উল্লেখ করেছেন, আপনি এমন কিছু করতে পারেন:

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"


/regex/g সিনট্যাক্স ব্যবহার করার পরিবর্তে, আপনি একটি নতুন RegExp বস্তু তৈরি করতে পারেন:

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

আপনি গতিশীলভাবে এই ভাবে regex বস্তু তৈরি করতে পারেন। তারপর আপনি করবেন:

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

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

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

এই tool দিয়ে পরীক্ষা






regex