javascript - জাভাস্ক্রিপ্ট একটি RegExp.escape ফাংশন আছে?




(8)

আমি শুধু একটি সম্ভাব্য স্ট্রিং আউট একটি নিয়মিত অভিব্যক্তি তৈরি করতে চান।

var usersString = "Hello?!*`~World()[]";
var expression = new RegExp(RegExp.escape(usersString))
var matches = "Hello".match(expression);

যে জন্য একটি নির্মিত পদ্ধতি আছে? যদি না হয়, মানুষ কি ব্যবহার করেন? রুবি RegExp.escape । আমি নিজেকে আমার লিখতে হবে মনে হয় না, সেখানে কিছু মানক হতে হবে। ধন্যবাদ!


Https://github.com/benjamingr/RexExp.escape/ এ https://github.com/benjamingr/RexExp.escape/ এ উপলব্ধ একটি পলিফিল সহ RegExp.escape এর জন্য একটি ES7 প্রস্তাব রয়েছে।


JQueryUI এর স্বতঃপূর্ণ উইজেট (সংস্করণ 1.9.1) এ তারা সামান্য ভিন্ন রেজেক্স (লাইন 6753) ব্যবহার করে, এখানে নিয়মিত অভিব্যক্তিটি @ বোবিনস পদ্ধতির সাথে মিলিত।

RegExp.escape = function( value ) {
     return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
}

অন্যান্য উত্তরগুলির ফাংশনগুলি সম্পূর্ণ নিয়মিত এক্সপ্রেশনগুলি এড়িয়ে চলার জন্য অতিরিক্ত হয় (তারা নিয়মিত এক্সপ্রেশনগুলির অংশগুলি এড়িয়ে যাওয়ার জন্য উপকারী হতে পারে যা পরবর্তীতে বড় রেজেক্সগুলিতে সংযোজন করা হবে)।

যদি আপনি একটি সম্পূর্ণ regexp থেকে অব্যাহতি দেন এবং এটির সাথে সম্পন্ন হয়, তবে মেটাচারার্টারগুলি উদ্ধৃত করে যা একক ( . , ? , + , * , ^ , $ , | , \ ) বা কিছু শুরু করুন ( ( , [ , { ) আপনার যা দরকার :

String.prototype.regexEscape = function regexEscape() {
  return this.replace(/[.?+*^$|({[\\]/g, '\\$&');
};

এবং হ্যাঁ, হতাশাজনক যে জাভাস্ক্রিপ্টটিতে এই বিল্ট-ইনের মত কোনও ফাংশন নেই।


উপরের লিঙ্ক ফাংশন অপর্যাপ্ত। এটি ^ বা $ (স্ট্রিং শুরু এবং শেষ) থেকে পালাতে ব্যর্থ হয়, অথবা - , যা একটি চরিত্র গোষ্ঠীতে রেঞ্জের জন্য ব্যবহৃত হয়।

এই ফাংশন ব্যবহার করুন:

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

প্রথম নজরে এটি অপ্রয়োজনীয় বলে মনে হতে পারে, তবে - (পাশাপাশি ^ ) অক্ষরগুলি পাল্টানোর জন্য উপযুক্ত অক্ষরটিকে অক্ষর শ্রেণীতে এবং রেজক্সের দেহে ঢোকানোর জন্য উপযুক্ত করে তোলে।

পরবর্তী eval জন্য একটি JS regex আক্ষরিক ব্যবহার অক্ষর escaping জন্য উপযুক্ত ফাংশন escaping / তোলে।

তাদের মধ্যে থেকে সরে যাওয়ার কোনও নেতিবাচক কারণ নেই, এটি ব্যাপক ব্যবহারের ক্ষেত্রে আচ্ছাদিত হওয়ার পক্ষে ইন্দ্রিয়গ্রাহ্য।

এবং হ্যাঁ, এটি একটি হতাশাজনক ব্যর্থতা যা এটি জাভাস্ক্রিপ্টের অংশ নয়।


এটি একটি ছোট সংস্করণ।

RegExp.escape = function(s) {
    return s.replace(/[$-\/?[-^{|}]/g, '\\$&');
}

এতে % , & , ' , এবং , এর অ-মেটা অক্ষর রয়েছে তবে জাভাস্ক্রিপ্ট RegExp স্পেসিফিকেশন এটি অনুমোদন করে।


লোডশ ব্যবহার করে যে কেউ, v3.0.0 একটি _.escapeRegExp ফাংশন অন্তর্নির্মিত হয়:

_.escapeRegExp('[lodash](https://lodash.com/)');
// → '\[lodash\]\(https:\/\/lodash\.com\/\)'

এবং, যদি আপনি সম্পূর্ণ লোডশ লাইব্রেরির প্রয়োজন না চান তবে আপনাকে কেবল সেই ফাংশনটির প্রয়োজন হতে পারে!


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

এই উদাহরণের জন্য, নিম্নলিখিত অভিব্যক্তি অনুমান করুন:

RegExp.escape('be || ! be');

এই সাদা তালিকা অক্ষর, সংখ্যা এবং স্থানসমূহ:

RegExp.escape = function (string) {
    return string.replace(/([^\w\d\s])/gi, '\\$1');
}

রিটার্নস:

"be \|\| \! be"

এটি এমন অক্ষরগুলি থেকে পালাতে পারে যা পালিয়ে যাওয়ার দরকার নেই, তবে এটি আপনার অভিব্যক্তিটিকে বাধা দেয় না (সম্ভবত কিছু ছোটখাট সময় জরিমানা - তবে এটি নিরাপত্তার জন্য মূল্যবান)।









regex