জাভাস্ক্রিপ্টে রেগেক্স প্যাটার্ন হিসাবে গতিশীল (পরিবর্তনশীল) স্ট্রিংটি ব্যবহার করুন


108

আমি রেগেক্সের সাথে মানগুলিতে একটি (পরিবর্তনশীল) ট্যাগ যুক্ত করতে চাই, পিএইচপি দিয়ে প্যাটার্নটি ভাল কাজ করে তবে জাভাস্ক্রিপ্টে এটি প্রয়োগ করতে আমার সমস্যা হচ্ছে।

প্যাটার্নটি হ'ল ( valueপরিবর্তনশীল):

/(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/is

আমি ব্যাকস্ল্যাশগুলি থেকে রক্ষা পেয়েছি:

var str = $("#div").html();
var regex = "/(?!(?:[^<]+>|[^>]+<\\/a>))\\b(" + value + ")\\b/is";
$("#div").html(str.replace(regex, "<a href='#" + value +">" + value + "</a>"));

তবে এটি সঠিক বলে মনে হচ্ছে না, আমি প্যাটার্নটি লগ ইন করেছি এবং এটি ঠিক কী হওয়া উচিত। কোন ধারনা?


কি valueএকটি পরিবর্তনশীল?
ডগবার্ট

উত্তর:


186

স্ট্রিং থেকে রেজেক্স তৈরি করতে আপনাকে জাভাস্ক্রিপ্টের RegExpঅবজেক্টটি ব্যবহার করতে হবে ।

আপনার কাছে মেলে / একটির বেশি সময় প্রতিস্থাপন করতে চান, তাহলে আপনি আবশ্যক যোগ (গ্লোবাল ম্যাচ) পতাকা । এখানে একটি উদাহরণ:g

var stringToGoIntoTheRegex = "abc";
var regex = new RegExp("#" + stringToGoIntoTheRegex + "#", "g");
// at this point, the line above is the same as: var regex = /#abc#/g;

var input = "Hello this is #abc# some #abc# stuff.";
var output = input.replace(regex, "!!");
alert(output); // Hello this is !! some !! stuff.

জেএসফিডাল ডেমো এখানে।


সাধারণ ক্ষেত্রে, রেজেক্স হিসাবে ব্যবহারের আগে স্ট্রিংটি এড়িয়ে যান:

কিছু speciall অক্ষর, মত: কোনো প্রত্যেক স্ট্রিং একটি বৈধ Regex, যদিও (বা [। এই সমস্যাটি নিয়ে কাজ করার জন্য, স্ট্রিংটিকে একটি রেজেজেসে পরিণত করার আগে কেবল এড়িয়ে চলুন। এর জন্য একটি ইউটিলিটি ফাংশন নীচের নমুনায় চলে যায়:

function escapeRegExp(stringToGoIntoTheRegex) {
    return stringToGoIntoTheRegex.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
}

var stringToGoIntoTheRegex = escapeRegExp("abc"); // this is the only change from above
var regex = new RegExp("#" + stringToGoIntoTheRegex + "#", "g");
// at this point, the line above is the same as: var regex = /#abc#/g;

var input = "Hello this is #abc# some #abc# stuff.";
var output = input.replace(regex, "!!");
alert(output); // Hello this is !! some !! stuff.

জেএসফিডাল ডেমো এখানে।



নোট: প্রশ্নে Regex ব্যবহার sপরিবর্তক, যা প্রশ্ন সময়ে উপস্থিত করেনি, কিন্তু কোন অস্তিত্ব নেই - একটি s( dotall জাভাস্ক্রিপ্ট মধ্যে) পতাকা / পরিবর্তক - আজ


4
এটি দুর্দান্ত এবং সর্বোত্তম উদাহরণ আইভ এখনও পর্যন্ত একটি রেইগেক্সে ডায়নামিক ভেরিয়েবল ব্যবহার করে খুঁজে পেয়েছি, ধন্যবাদ!
ইওলিস

4
2019 এর জন্য s সংশোধক রয়েছে, উত্তরের নোটে আবার MDN লিঙ্কটি দেখুন।
নিকসৌল

পছন্দ করুন সতর্ক থাকুন জন্য ধন্যবাদ!
acdcjunior

আসুন idr = নতুন RegExp (পরিবর্তনশীল + "$"); টেবিল.ফাইন্ড ({ক্ষেত্র: নতুন রেজিপ্যাক্স (আইডিআর, 'আই')}) আমি এটি পছন্দ করেছি। চিয়ার্স
উত্সর্চ

14

আপনি যদি এক্সপ্রেশনটিতে একটি ভেরিয়েবল মান ব্যবহার করার চেষ্টা করছেন, আপনাকে অবশ্যই RegExp "কনস্ট্রাক্টর" ব্যবহার করতে হবে।

var regex="(?!(?:[^<]+>|[^>]+<\/a>))\b(" + value + ")\b";
new RegExp(regex, "is")

7

আপনার "কেবল নিয়মিত প্রকাশের সংজ্ঞা দেওয়ার দরকার নেই :

var regex = /(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/is; // this is valid syntax

যদি valueপরিবর্তনশীল হয় এবং আপনি একটি গতিশীল নিয়মিত প্রকাশ চান তবে আপনি এই স্বরলিপিটি ব্যবহার করতে পারবেন না; বিকল্প স্বরলিপি ব্যবহার করুন।

String.replace স্ট্রিংগুলি ইনপুট হিসাবে গ্রহণ করে, তাই আপনি এটি করতে পারেন "fox".replace("fox", "bear");

বিকল্প:

var regex = new RegExp("/(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/", "is");
var regex = new RegExp("/(?!(?:[^<]+>|[^>]+<\/a>))\b(" + value + ")\b/", "is");
var regex = new RegExp("/(?!(?:[^<]+>|[^>]+<\/a>))\b(.*?)\b/", "is");

মনে রাখবেন যে যদি valueমত রেগুলার এক্সপ্রেশনের অক্ষর রয়েছে (, [এবং ?আপনি তাদের অব্যাহতি প্রয়োজন হবে।


4
"মান" স্ট্রিংটি না
খুঁজলে

@ হ্যাপিটাইমাহারি তার পোস্ট করা দুটি রেগেক্সপের মধ্যে বিরোধ দেখা দিয়েছে।
হালসিওন

@ ফ্রিজ ভ্যান ক্যাম্পেন দেখে মনে হচ্ছে যে তাঁর জাভাস্ক্রিপ্ট থেকে উদাহরণটি দেওয়া হয়েছে, সেই প্যাটার্নের অভিপ্রায়টি ছিল একটি পরিবর্তনশীল
মথমোনস্টারম্যান

এখানেও একই সমস্যা, "হ'ল" পতাকাটিতে কিছু ভুল আছে বলে মনে হচ্ছে: "আনকচড সিনট্যাক্স এরির: রেজেক্সপ কনস্ট্রাক্টর'কে সরবরাহ করা অবৈধ পতাকাগুলি" "
বোর্স্টেনহর্স্ট

RegExp এর নির্মাতার জন্য পতাকাগুলি পৃথক করা দরকার। কিন্তু তবুও রেজেক্স কাজ করছে না।
বোর্স্টেনহর্স্ট

5

আমি এই থ্রেডটি দরকারী বলে মনে করেছি - তাই আমি ভেবেছিলাম যে আমি আমার নিজের সমস্যার উত্তর যুক্ত করব।

আমি জাভাস্ক্রিপ্টে নোড অ্যাপ্লিকেশন থেকে একটি ডাটাবেস কনফিগারেশন ফাইল (ডেটাস্ট্যাক্স ক্যাসান্দ্রা) সম্পাদনা করতে চেয়েছিলাম এবং ফাইলের একটি সেটিংসের জন্য আমার একটি স্ট্রিংয়ের সাথে মিল রাখতে হবে এবং তারপরে লাইনটি প্রতিস্থাপন করতে হবে।

এটি আমার সমাধান ছিল।

dse_cassandra_yaml='/etc/dse/cassandra/cassandra.yaml'

// a) find the searchString and grab all text on the following line to it
// b) replace all next line text with a newString supplied to function
// note - leaves searchString text untouched
function replaceStringNextLine(file, searchString, newString) {
fs.readFile(file, 'utf-8', function(err, data){
if (err) throw err;
    // need to use double escape '\\' when putting regex in strings !
    var re = "\\s+(\\-\\s(.*)?)(?:\\s|$)";
    var myRegExp = new RegExp(searchString + re, "g");
    var match = myRegExp.exec(data);
    var replaceThis = match[1];
    var writeString = data.replace(replaceThis, newString);
    fs.writeFile(file, writeString, 'utf-8', function (err) {
    if (err) throw err;
        console.log(file + ' updated');
    });
});
}

searchString = "data_file_directories:"
newString = "- /mnt/cassandra/data"

replaceStringNextLine(dse_cassandra_yaml, searchString, newString );

চলার পরে, এটি বিদ্যমান ডেটা ডিরেক্টরি ডিরেক্টরিটিকে নতুনতে পরিবর্তন করবে:

কনফিগার করার আগে ফাইল:

data_file_directories:  
   - /var/lib/cassandra/data

কনফিগারেশন ফাইলের পরে:

data_file_directories:  
- /mnt/cassandra/data

4

আমি দেখেছি এটির কাজ পেতে আমাকে I b দ্বিগুণ করতে হবে। উদাহরণস্বরূপ একটি ভেরিয়েবল ব্যবহার করে স্ট্রিং থেকে "1x" শব্দগুলি সরানোর জন্য, আমার ব্যবহার করা দরকার:

    str = "1x";
    var regex = new RegExp("\\b"+str+"\\b","g"); // same as inv.replace(/\b1x\b/g, "")
    inv=inv.replace(regex, "");

আমার জন্য কাজ করেছেন। ধন্যবাদ,
প্রবীণ ভাপকার


0
var string = "Hi welcome to stack overflow"
var toSearch = "stack"

//case insensitive search

var result = string.search(new RegExp(toSearch, "i")) > 0 ? 'Matched' : 'notMatched'

https://jsfiddle.net/9f0mb6Lz/

আশাকরি এটা সাহায্য করবে

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