জাভাস্ক্রিপ্ট রেজেক্স: একটি নিয়মিত এক্সপ্রেশন ভিতরে একটি পরিবর্তনশীল রাখা কিভাবে?


206

উদাহরণস্বরূপ:

function(input){
    var testVar = input;
    string = ...
    string.replace(/ReGeX + testVar + ReGeX/, "replacement")
}

তবে এটি অবশ্যই কাজ করছে না :) এটি করার কোনও উপায় আছে কি?


11
সচেতন হন যে আপনি যদি ব্যবহারকারীটিকে এই পরিবর্তনশীল সরবরাহ করতে দেন তবে দূষিত ব্যবহারকারীর পক্ষে বিপর্যয়কর ব্যাকট্র্যাকিংয়ের মাধ্যমে আপনার অ্যাপ্লিকেশনটি ক্র্যাশ করা সহজ।
টিম পিটজ্যাকার

2
"রেজিএক্স" কী? এটি একটি পরিবর্তনশীল নাম? এটি রেগএক্সপ নির্মাণের অংশ বলে ইঙ্গিত দিয়ে উত্তরগুলিকে বিভ্রান্ত করে তোলে (যদি কোনও পাঠক প্রশ্নে এই অদ্ভুত চরিত্রগুলি না দেখেন)।
এডুয়ার্ড

উত্তর:


272
const regex = new RegExp(`ReGeX${testVar}ReGeX`);
...
string.replace(regex, "replacement");

হালনাগাদ

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

ES6 আপডেট

2019 এ, এটি সাধারণত টেমপ্লেট স্ট্রিং ব্যবহার করে লেখা হবে এবং উপরের কোডটি আপডেট করা হয়েছে। আসল উত্তরটি ছিল:

var regex = new RegExp("ReGeX" + testVar + "ReGeX");
...
string.replace(regex, "replacement");

5
আপনার স্ট্রিং এড়ানো নিশ্চিত করুন! @ZzzzBov এর উত্তর দেখুন
jtpereyda

এটি আমার ক্ষেত্রে কাজ করছে না, আপনি কি দয়া করে এই জিসফিডেলটি দেখতে পারেন এবং যদি আমাকে কোনও দেশ কোড গতিশীল হিসাবে regexপ্রকাশ করতে চান তবে আমাকে কী করতে হবে তা আমাকে জানান
কিরণকুমার দফদা

10
একটি গুরুত্বপূর্ণ বিষয় মনে রাখবেন যে নিয়মিত স্ট্রিংগুলিতে \ চরিত্রটিকে পালাতে হবে যখন রেজেক্স আক্ষরিক (সাধারণত) / চরিত্রটিকে পালাতে হবে। তাই /\w+\//iহয়ে যায়new RegExp("\\w+/", "i")
আলী

3
কীভাবে / জি?
কিয়ান চেন

বন্ধুরা, আমাকে এই রেজেক্সটি / ছেদক -0-9.- +/g কে দুটি ভাগে ভাগ করতে হবে: / [^ 0-9 এবং -] / জি এটি কীভাবে করবেন?
সর্বোচ্চ

79

আপনি RegExp অবজেক্টটি ব্যবহার করতে পারেন:

var regexstring = "whatever";
var regexp = new RegExp(regexstring, "gi");
var str = "whateverTest";
var str2 = str.replace(regexp, "other");
document.write(str2);

তারপরে আপনি যে regexstringকোনও উপায়ে নির্মাণ করতে পারেন।

আপনি এটি সম্পর্কে এখানে আরও পড়তে পারেন ।


var ক্যারেক্টারকাউন্ট = পার্সেন্ট (attrs.limitCharacterCount); console.log (characterCount); var specialCharactersValidation = নতুন RegExp ("/ ^ [a-zA-Z0-9] {" + অক্ষরকઉન્ટ + "} $ /"); / \ / ^ [a-zA-Z0-9] {7} $ \ // রিকোয়েশনডাইরেক্টিভস.জেজেস: 76 টি ভুয়া মেইন.জেএস: 46 অপরিচিত টাইপ এরর: নাল'র সম্পত্তি 'অফসেটউইথ' পড়তে পারছেন না আমি যখন তৈরি করি তখন এটি ঘটছে RegEx ডায়নামিক।
অঙ্কিত তন্ন

31

জাভাস্ক্রিপ্টে কোনও ভেরিয়েবল থেকে নিয়মিত এক্সপ্রেশন তৈরি করতে আপনাকে RegExpস্ট্রিং প্যারামিটার দিয়ে কনস্ট্রাক্টর ব্যবহার করতে হবে ।

function reg(input) {
    var flags;
    //could be any combination of 'g', 'i', and 'm'
    flags = 'g';
    return new RegExp('ReGeX' + input + 'ReGeX', flags);
}

অবশ্যই, এটি একটি খুব নিষ্পাপ উদাহরণ। এটি ধরে নেওয়া হয় যে inputনিয়মিত প্রকাশের জন্য যথাযথভাবে পালানো হয়েছে। আপনি যদি ব্যবহারকারী-ইনপুট নিয়ে কাজ করে থাকেন বা বিশেষ চরিত্রের সাথে মিলে যাওয়া আরও সহজ করে তুলতে চান তবে আপনাকে বিশেষ অক্ষরগুলি থেকে বাঁচতে হবে :

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

function reg(input) {
    var flags;
    //could be any combination of 'g', 'i', and 'm'
    flags = 'g';
    input = regexEscape(input);
    return new RegExp('ReGeX' + input + 'ReGeX', flags);
}

আমি ReGeXপাঠ্য মুছে ফেলা হলে এটি কেবল আমার জন্য কাজ করেছিল । সুতরাং আমি ব্যবহার করেছি:return new RegExp(input, flags);
মাইকেল র্যাডার

2
@ মিশেলরেডার, হ্যাঁ, "রেজিএক্স" পাঠ্যটি প্রশ্নের অংশ ছিল এবং উদাহরণ হিসাবে ব্যবহৃত হয়েছিল, কোডটির কাজ করার জন্য প্রয়োজনীয় কিছু হিসাবে নয়।
zzzzBov

1
লল বুঝতে পেরেছিল যে এটি কেবলমাত্র আপনার স্থানধারক, তবে একটি নুব হিসাবে এটি আমাকে কিছুটা সময় নিয়েছিল। ধন্যবাদ।
মাইকেল র্যাডার

আমি বুঝতে পারি কেন স্ট্রিংয়ের হাত থেকে বাঁচতে হবে। তবে কেন '\\ $ &' ​​প্রতিস্থাপন হিসাবে ব্যবহৃত হয়
শেরিন বিনু

2
\\একটি একক \অক্ষরকে উপস্থাপন করে, $&এটি ম্যাচ করা সাবস্ট্রিং
zzzzBov

7

আপনি যদি এস template টেমপ্লেটের আক্ষরিক ব্যবহার করছেন তবে এটি একটি বিকল্প ...

string.replace(new RegExp(`ReGeX${testVar}ReGeX`), "replacement")

এটি টেম্পলেট আক্ষরিক সাথে কাজ করে না। আমি আমার অ্যাপ্লিকেশনটিতে পাসওয়ার্ড যাচাই করতে regexp ব্যবহার করছি এবং আমি আমার নিয়মিত প্রকাশের স্ট্রিংয়ে সর্বোচ্চ এবং ন্যূনতম দৈর্ঘ্যের প্যারামিটারাইজ করতে চেয়েছিলাম এবং এটি কার্যকর হয় না। new `` const newRegExp = নতুন RegExp ( ^[^\s]{${4},${32}}$); রপ্তানি কনট বৈধতাপ্যাসওয়ার্ড = মান => মান.ম্যাচ (নতুনরেগএক্সপ); । ``
p7adams

6

আপনি সর্বদা স্ট্রিং হিসাবে নিয়মিত প্রকাশ করতে পারেন, যেমন "ReGeX" + testVar + "ReGeX" । আপনার স্ট্রিংয়ের ভিতরে আপনাকে কয়েকটি অক্ষর থেকে বাঁচতে হবে (যেমন, ডাবল উদ্ধৃতি), তবে বেশিরভাগ ক্ষেত্রে এটি সমতুল্য।

আপনি ব্যবহার করতে পারেন RegExp পতাকাগুলি পাস করার কনস্ট্রাক্টরও ( ডক্স দেখুন )।


3

আপনি দুটি উপায়ের একটিতে জেএসে নিয়মিত প্রকাশ তৈরি করতে পারেন:

  1. আক্ষরিক নিয়মিত অভিব্যক্তি ব্যবহার - /ab{2}/g
  2. নিয়মিত এক্সপ্রেশন কনস্ট্রাক্টর ব্যবহার করে - new RegExp("ab{2}", "g")

নিয়মিত এক্সপ্রেশন আক্ষরিক ধ্রুবক হয়, এবং ভেরিয়েবলের সাথে ব্যবহার করা যায় না। এটি কনস্ট্রাক্টর ব্যবহার করে অর্জন করা যেতে পারে। RegEx কনস্ট্রাক্টর এর স্ট্রাকচার হয়

new RegExp(regularExpressionString, modifiersString)

আপনি নিয়মিত এক্সপ্রেশনস্ট্রিংয়ের অংশ হিসাবে ভেরিয়েবল এম্বেড করতে পারেন। উদাহরণ স্বরূপ,

var pattern="cd"
var repeats=3
new RegExp(`${pattern}{${repeats}}`, "g") 

এটি প্যাটার্নের কোনও উপস্থিতির সাথে মিলবে cdcdcd


2

এখানে একটি চমত্কার অকেজো ফাংশন যা নির্দিষ্ট অক্ষর দ্বারা মোড়ানো মানগুলি ফেরত দেয়। :)

জেএসফিডাল: https://jsfiddle.net/squadjot/43agwo6x/

function getValsWrappedIn(str,c1,c2){
    var rg = new RegExp("(?<=\\"+c1+")(.*?)(?=\\"+c2+")","g"); 
    return str.match(rg);
    }

var exampleStr = "Something (5) or some time (19) or maybe a (thingy)";
var results =  getValsWrappedIn(exampleStr,"(",")")

// Will return array ["5","19","thingy"]
console.log(results)

2

গৃহীত উত্তর আমার পক্ষে কাজ করে না এবং MDN উদাহরণ অনুসরণ করে না

উপরের লিঙ্কে 'বিবরণ' বিভাগটি দেখুন

আমি নিম্নলিখিতটি নিয়ে যাব এটি আমার জন্য কাজ করছে:

let stringThatIsGoingToChange = 'findMe';
let flagsYouWant = 'gi' //simple string with flags
let dynamicRegExp = new RegExp(`${stringThatIsGoingToChange}`, flagsYouWant)

// that makes dynamicRegExp = /findMe/gi

1
এটি এখনও কাজ করে। সমস্যাটি হ'ল 'রেজিেক্স' + টেস্টভার + 'রেজিএক্স' সমাধানটিকে বিভ্রান্ত করে তোলে। প্রকৃত উদাহরণ যুক্ত করা আমার মতে জিনিসগুলি পরিষ্কার করে দেবে। var testVar = '321'; var regex = নতুন RegExp ("[" + + টেস্টভার + "] {2}", "জি"); // এর সমতুল্য / / [321] {2} / জি
হ্যালো ওয়ার্ল্ডপিস

1

প্রথমে স্ট্রিং ভেরিয়েবল প্রস্তুত করা এবং তারপরে এটি RegEx এ রূপান্তর করা দরকার।

উদাহরণ স্বরূপ:

আপনি যোগ করতে চান minLengthএবং MaxLengthRegex পরিবর্তনশীল সঙ্গে

function getRegEx() {
    const minLength = "5"; // for exapmle: min is 5
    const maxLength = "12"; // for exapmle: man is 12

    var regEx = "^.{" + minLength + ","+ maxLength +"}$"; // first we make a String variable of our RegEx
    regEx = new RegExp(regEx, "g"); // now we convert it to RegEx

    return regEx; // In the end, we return the RegEx
}

এখন যদি আপনি MaxLengthবা এর মান পরিবর্তন করেনMinLength , এটা সব RegExs মধ্যে পরিবর্তন করতে হবে।

আশা করি কাজে লাগবে। আমার ইংরেজি সম্পর্কেও দুঃখিত।

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