স্ট্রিং ভেরিয়েবলগুলি ব্যবহার করে ফ্লাইতে RegExps তৈরি করুন


138

বলুন যে আমি নিম্নলিখিতগুলি পুনরায় ব্যবহারযোগ্য করে তুলতে চাইছিলাম:

function replace_foo(target, replacement) {
   return target.replace("string_to_replace",replacement);
}

আমি এরকম কিছু করতে পারি:

function replace_foo(target, string_to_replace, replacement) {
   return target.replace(string_to_replace,replacement);
}

স্ট্রিং আক্ষরিক সাথে এটি যথেষ্ট সহজ। তবে আমি যদি রেজেক্সের সাথে আরও কিছুটা কৌশল পেতে চাই? উদাহরণস্বরূপ, বলুন আমি সবকিছু বদলাতে চাই তবে string_to_replace । সহজাতভাবে আমি এ জাতীয় কিছু করে উপরেরটি প্রসারিত করার চেষ্টা করব:

function replace_foo(target, string_to_replace, replacement) {
   return target.replace(/^string_to_replace/,replacement);
}

এটি কাজ করে না বলে মনে হচ্ছে। আমার অনুমান যে এটি string_to_replaceএকটি স্ট্রিং প্রতিনিধিত্বকারী ভেরিয়েবলের চেয়ে স্ট্রিং আক্ষরিক বলে মনে করে । স্ট্রিং ভেরিয়েবলগুলি ব্যবহার করে ফ্লাইতে জাভাস্ক্রিপ্ট পুনরায় তৈরি করা সম্ভব? যদি সম্ভব হয় তবে এরকম কিছু দুর্দান্ত হবে:

function replace_foo(target, string_to_replace, replacement) {
   var regex = "/^" + string_to_replace + "/";
   return target.replace(regex,replacement);
}

উত্তর:


215

আছে new RegExp(string, flags)যেখানে flagsহয় gবা i। সুতরাং

'GODzilla'.replace( new RegExp('god', 'i'), '' )

মূল্যায়ন

zilla

31
এবং /এই ফর্মটি ব্যবহার করার সময় রেজেক্স ডিলিমিটারগুলি বাদ দিন ।
সিডিওউই

111

স্ট্রিং আক্ষরিক সাথে এটি যথেষ্ট সহজ।

আসলে তা না! উদাহরণটি কেবল প্রথম ঘটনাকেই প্রতিস্থাপন করে string_to_replace। আরও সাধারণভাবে আপনি সমস্ত ঘটনাকে প্রতিস্থাপন করতে চান, সেক্ষেত্রে আপনাকে স্ট্রিংটিকে একটি বিশ্ব ( /.../g) রেজিপ্লেসে রূপান্তর করতে হবে । আপনি new RegExpকনস্ট্রাক্টর ব্যবহার করে স্ট্রিং থেকে এটি করতে পারেন :

new RegExp(string_to_replace, 'g')

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

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

এছাড়াও খেয়াল করুন যে আপনি যখন একটি RegExp ইন ব্যবহার করেন replace(), প্রতিস্থাপনের স্ট্রিংটিতে এখন একটি বিশেষ অক্ষরও থাকে $। আপনি $যদি আপনার প্রতিস্থাপন পাঠ্যে আক্ষরিক থাকতে চান তবে এটি অবশ্যই পালাতে হবে !

function escapeSubstitute(s) {
    return s.replace(/\$/g, '$$$$');
}

(চারটি $কারণ এটি নিজেই প্রতিস্থাপনের স্ট্রিং — আরগ!)

এখন আপনি RegExp এর মাধ্যমে বৈশ্বিক স্ট্রিং প্রতিস্থাপনটি প্রয়োগ করতে পারেন:

function replace_foo(target, string_to_replace, replacement) {
    var relit= escapeRegExp(string_to_replace);
    var sub= escapeSubstitute(replacement);
    var re= new RegExp(relit, 'g');
    return target.replace(re, sub);
}

কি যে ব্যথা. ভাগ্যক্রমে আপনি যদি যা করতে চান তেমন কোনও রেগেক্সের কোনও অতিরিক্ত অংশবিহীন একটি স্ট্রিং স্ট্রিং প্রতিস্থাপন করা হয় তবে একটি দ্রুত উপায় আছে:

s.split(string_to_replace).join(replacement)

...এবং যে সব. এটি একটি সাধারণভাবে বোঝা আইডিয়াম।

বলুন আমি স্ট্রিং_ট_রেপস বাদে সবকিছু বদলাতে চাই

এর অর্থ কী, আপনি স্ট্রিংয়ের বিপক্ষে ম্যাচে অংশ না নিয়ে সমস্ত প্রবন্ধকে প্রতিস্থাপন করতে চান? ^অবশ্যই একটি প্রতিস্থাপন এটি হয় না, কারণ ^একটি স্ট্রিং অফ স্ট্রিং টোকেন, একটি অবহেলা নয় not চরিত্র গোষ্ঠীগুলির ^মধ্যে কেবল একটি উপকার []। নেতিবাচক লুকোহেডগুলিও রয়েছে (?!...)তবে জেএসক্রিপ্টে এতে সমস্যা রয়েছে তাই আপনার এটিকে সাধারণত এড়ানো উচিত।

আপনি স্ট্রিংয়ের সাথে 'সমস্ত কিছু মিলিয়ে' চেষ্টা করতে পারেন, এবং ম্যাচের স্ট্রিংগুলির মধ্যে কোনও ফাঁকা প্রসারিত ত্যাগ করতে একটি ফাংশন ব্যবহার করে:

var re= new RegExp('(.*)($|'+escapeRegExp(string_to_find)+')')
return target.replace(re, function(match) {
    return match[1]===''? match[2] : replacement+match[2];
});

এখানে, আবার, একটি বিভাজন সহজ হতে পারে:

var parts= target.split(string_to_match);
for (var i= parts.length; i-->0;)
    if (parts[i]!=='')
        parts[i]= replacement;
return parts.join(string_to_match);

10

অন্যরা যেমন বলেছে, এটি ব্যবহার করুন new RegExp(pattern, flags)। এটি লক্ষণীয় যে আপনি এই নির্মাণকারীর কাছে স্ট্রিং লিটারালগুলি পাঠাবেন, সুতরাং প্রতিটি ব্যাকস্ল্যাশ এড়িয়ে যেতে হবে। উদাহরণস্বরূপ, আপনি যদি চান যে আপনার রেজেক্সটি একটি ব্যাকস্ল্যাশের সাথে মেলে new RegExp('\\\\'), তবে আপনাকে বলার দরকার ছিল , যখন রেজেক্স আক্ষরিক কেবল প্রয়োজন /\\/। আপনি এটি কীভাবে ব্যবহার করবেন তা নির্ভর করে, পর্যাপ্ত প্রাকপ্রসেসিং ছাড়াই (বিশেষ অক্ষরগুলি অবলম্বন করা ইত্যাদি) ছাড়াই আপনাকে এই জাতীয় ফাংশনে ব্যবহারকারীদের ইনপুট দেওয়ার বিষয়ে সতর্ক হওয়া উচিত this এগুলি ছাড়া আপনার ব্যবহারকারীরা খুব অপ্রত্যাশিত ফলাফল পেতে পারেন।


3
এই উত্তরটি সর্বাধিক বিস্তারিত না হলেও, একটি গুরুত্বপূর্ণ বিবরণ উল্লেখ করেছে যা আমি কেবল এক ঘন্টার জন্য আটকে ছিলাম: কোনও বিশেষ ক্রমগুলি এড়িয়ে চলুন। উদাহরণস্বরূপ, আমি একটি নির্দিষ্ট শব্দ দিয়ে শুরু করে একটি শব্দের সন্ধান করছিলাম, সুতরাং আমার যে রেজেক্সটি প্রয়োজন তা হ'ল /\b[term]\B/তবে এটি নির্মাণের সময় আমার কল করা দরকার new RegExp("\\b"+ term + "\\B")। ছোট কিন্তু গুরুত্বপূর্ণ পার্থক্য এবং স্পষ্ট করা শক্ত যেহেতু এটিকে একটি রেজেক্স হিসাবে সরাসরি ব্যবহার করা প্রত্যাশার মতো কাজ করে
বাইসন 14


0

আমি মনে করি স্ট্রিংয়ে হাইলাইট পাঠ্যের জন্য আমার কাছে খুব ভাল উদাহরণ রয়েছে (এটি নিবন্ধের দিকে চেয়ে দেখেনি তবে রেজিস্টার ব্যবহার করে হাইলাইট করা হয়েছে)

function getHighlightedText(basicString, filterString) {

    if ((basicString === "") || (basicString === null) || (filterString === "") || (filterString === null)) return basicString;

    return basicString.replace(new RegExp(filterString.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\\\$&'), 'gi'),
        function(match)
            {return "<mark>"+match+"</mark>"});

}

http://jsfiddle.net/cdbzL/1258/


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