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


442

আমি কেবল কোনও সম্ভাব্য স্ট্রিংয়ের বাইরে একটি নিয়মিত প্রকাশ করতে চাই।

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

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


15
কেবলমাত্র আপনাকে সূক্ষ্ম লোকের আপডেট করতে চেয়েছিলেন RegExp.escapeযা বর্তমানে কাজ করা হয়েছে এবং যে কেউ মনে করে যে তাদের মূল্যবান ইনপুট রয়েছে তা অবদানের জন্য অত্যন্ত স্বাগত। কোর-জেএস এবং অন্যান্য পলিফিলগুলি এটি সরবরাহ করে।
বেনিয়ামিন গ্রুইনবাউম

5
এই উত্তরের সাম্প্রতিক আপডেট অনুসারে এই প্রস্তাবটি প্রত্যাখ্যান করা হয়েছিল: সমস্যাটি দেখুন
চেষ্টা করুন - অবশেষে

উত্তর:


573

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

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

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

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

পলায়নপর / ফাংশনটিকে পালনের জন্য জেএস রেজেক্স আক্ষরিক হিসাবে পরে স্পষ্ট করার জন্য উপযুক্ত করে তোলে।

এদের উভয়কেই পালানোর পক্ষে কোনও নেতিবাচক প্রভাব নেই বলেই বিস্তৃত ব্যবহারের ক্ষেত্রে কভার করতে পলায়ন করা বুদ্ধিমানের কাজ।

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


16
আসলে, আমরা পালিয়ে যেতে প্রয়োজন হবে না /এ সব
কাঁটা

28
@ পল: পার্ল quotemeta( \Q), পাইথন re.escape, পিএইচপি preg_quote, রুবি Regexp.quote...
বোবিন্স

13
আপনি যদি এই ফাংশনটি একটি লুপে ব্যবহার করতে যাচ্ছেন তবে RegExp অবজেক্টটিকে নিজস্ব ভেরিয়েবল বানানো সম্ভবত সেরা var e = /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g;এবং তারপরে আপনার ফাংশনটি return s.replace(e, '\\$&');এইভাবে আপনি একবার RegExp একবার ইনস্ট্যান্ট করবেন।
styfle

15
বিল্ট-ইন অবজেক্টগুলিকে বাড়ানোর বিরুদ্ধে স্ট্যান্ডার্ড আর্গুমেন্টগুলি এখানে প্রয়োগ হয়, না? যদি ভবিষ্যতের ECMAScript এর সংস্করণ এমন একটি সরবরাহ করে RegExp.escapeযার বাস্তবায়ন আপনার থেকে পৃথক হয়? এই ফাংশনটি কোনও কিছুর সাথে সংযুক্ত না থাকা ভাল কি না?
মার্ক আমেরি

15
বোবিন্স এসিলিন্টের মতামতের জন্য চিন্তা করে না
বোবিনস

114

যে কোনও লোকের জন্য লড্যাশ ব্যবহার করছেন, v3.0.0 থেকে একটি _.সেস্কেপরেগএক্সপ্যাক্স ফাংশনটি অন্তর্নির্মিত:

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

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


6
এই মাত্র একটি এনপিএম প্যাকেজ আছে! npmjs.com/package/lodash.escaperegexp
টেড

1
এটি কোডের প্রচুর পরিমাণে আমদানি করে যা এমন সাধারণ জিনিসের জন্য সত্যই সেখানে থাকার প্রয়োজন হয় না। বোবিন্সের উত্তরটি ব্যবহার করুন ... লড্যাশ সংস্করণের চেয়ে লোড করার জন্য আমার এবং এর অনেক কম বাইটের জন্য কাজ করে!
রব ইভানস

6
@RobEvans সঙ্গে আমার উত্তর শুরু "কারো জন্য lodash ব্যবহার" , এবং আমি এমনকি যে আপনি প্রয়োজন হতে পারে উল্লেখ শুধুমাত্রescapeRegExp ফাংশন।
গুস্তাভোহেঙ্কে

2
@ গুস্তাভোহেনকে দুঃখিত, আমি আরও কিছুটা পরিষ্কার হওয়া উচিত ছিল, আমি আপনার "ঠিক সেই ফাংশন" এর সাথে লিঙ্কযুক্ত মডিউলটি অন্তর্ভুক্ত করেছি এবং এটিই আমি মন্তব্য করছি। আপনি যদি একবার খেয়াল করেন তবে এটির মধ্যে একক regexp সহ কার্যকরভাবে কোনও একক ফাংশনটি কী হওয়া উচিত তার কোডগুলি বেশ। আপনি যদি ইতিমধ্যে লোডাশ ব্যবহার করছেন তবে সম্মত হন তবে এটির ব্যবহারটি বোধগম্য হয়, তবে অন্যথায় অন্য উত্তরটি ব্যবহার করুন। অস্পষ্ট মন্তব্যের জন্য দুঃখিত।
রব ইভান্স

2
@ এমডিডব আমি দেখতে পাচ্ছি না যে আপনি \ x3 উল্লেখ করেছেন: আমার পালানো স্ট্রিংগুলি দেখতে ভাল দেখাচ্ছে, যা আমি প্রত্যাশা করি
ফেডেরিকো ফিসোর

43

এখানে বেশিরভাগ এক্সপ্রেশন একক নির্দিষ্ট ব্যবহারের ক্ষেত্রে সমাধান করে।

এটি ঠিক আছে, তবে আমি একটি "সর্বদা কাজ করে" পদ্ধতির পছন্দ করি।

function regExpEscape(literal_string) {
    return literal_string.replace(/[-[\]{}()*+!<=:?.\/\\^$|#\s,]/g, '\\$&');
}

এটি নিয়মিত অভিব্যক্তিতে নিম্নলিখিত যে কোনও ব্যবহারের জন্য একটি আক্ষরিক স্ট্রিং "পুরোপুরি পালাতে" সক্ষম হবে:

  • একটি নিয়মিত প্রকাশে সন্নিবেশ। যেমনnew RegExp(regExpEscape(str))
  • একটি অক্ষর শ্রেণিতে সন্নিবেশ। যেমনnew RegExp('[' + regExpEscape(str) + ']')
  • পূর্ণসংখ্যা গণনা নির্দিষ্টকারীর মধ্যে সন্নিবেশ। যেমনnew RegExp('x{1,' + regExpEscape(str) + '}')
  • নন-জাভাস্ক্রিপ্ট নিয়মিত এক্সপ্রেশন ইঞ্জিনগুলিতে কার্যকর করা।

বিশেষ চরিত্রগুলি আবৃত:

  • -: একটি অক্ষর শ্রেণিতে একটি চরিত্রের সীমা তৈরি করে।
  • [ / ] : একটি অক্ষর শ্রেণীর শুরু / সমাপ্ত হয়।
  • { / } : একটি সংখ্যার নির্দিষ্টকারীকে শুরু / শেষ করে।
  • ( / ) : একটি গোষ্ঠী শুরু / শেষ হয়।
  • */ +/? : পুনরাবৃত্তির ধরণ নির্দিষ্ট করে।
  • .: যে কোনও চরিত্রের সাথে মেলে।
  • \: অক্ষরগুলি ছেড়ে যায় এবং সত্ত্বা শুরু করে।
  • ^: ম্যাচিং জোনটির সূচনা নির্দিষ্ট করে এবং একটি অক্ষর শ্রেণিতে ম্যাচটি উপেক্ষা করে।
  • $: ম্যাচিং জোনের শেষ উল্লেখ করে।
  • |: অল্টারনেশন নির্দিষ্ট করে।
  • #: ফ্রি স্পেসিং মোডে মন্তব্য নির্দিষ্ট করে।
  • \s: ফ্রি স্পেসিং মোডে উপেক্ষা করা হয়েছে।
  • ,: সংখ্যা নির্দিষ্টকরণে পৃথক করে মান।
  • /: প্রকাশ বা সমাপ্তি প্রকাশ।
  • :: বিশেষ গোষ্ঠী প্রকার এবং পার্ল-শৈলীর চরিত্রের শ্রেণীর অংশ সম্পূর্ণ করে।
  • !: শূন্য-প্রস্থের গ্রুপটিকে নেগেট করে।
  • </ =: শূন্য প্রস্থের গ্রুপ স্পেসিফিকেশনের অংশ।

মন্তব্য:

  • /নিয়মিত প্রকাশের কোনও স্বাদে কঠোরভাবে প্রয়োজন হয় না। তবে কেউ (কাঁপুনি করা) ক্ষেত্রে সুরক্ষিত করে eval("/" + pattern + "/");
  • , নিশ্চিত করে যে যদি স্ট্রিংটি সংখ্যার স্পেসিফায়ারে একটি পূর্ণসংখ্যা হিসাবে বোঝানো হয় তবে এটি নিঃশব্দে ভুল সংকলনের পরিবর্তে একটি RegExp সংকলন ত্রুটি ঘটায় properly
  • #, এবং \sজাভাস্ক্রিপ্টে পালানোর দরকার নেই, তবে অন্য অনেক স্বাদে করুন। নিয়মিত প্রকাশটি পরে অন্য কোনও প্রোগ্রামে প্রেরণ করা হয় তবে তারা এখানে পালিয়ে যায়।

আপনার যদি জাভা স্ক্রিপ্ট রেজেক্স ইঞ্জিন ক্ষমতার সম্ভাব্য সংযোজনগুলির বিরুদ্ধে নিয়মিত প্রকাশের ভবিষ্যত-প্রমাণের প্রয়োজন হয় তবে আমি আরও বিড়ম্বনা ব্যবহার করার পরামর্শ দিচ্ছি:

function regExpEscapeFuture(literal_string) {
    return literal_string.replace(/[^A-Za-z0-9_]/g, '\\$&');
}

এই ফাংশনটি ভবিষ্যতের নিয়মিত প্রকাশের স্বাদে সিনট্যাক্সের জন্য স্পষ্টভাবে গ্যারান্টিযুক্ত গ্যারান্টিযুক্ত বাদে প্রতিটি চরিত্রকে ছাড়িয়ে যায়।


সত্যিকারের স্যানিটেশন-আগ্রহীদের জন্য, এই প্রান্তের বিষয়টি বিবেচনা করুন:

var s = '';
new RegExp('(choice1|choice2|' + regExpEscape(s) + ')');

এটি জাভাস্ক্রিপ্টে সূক্ষ্ম সংকলন করা উচিত , তবে অন্য কিছু স্বাদে হবে না। যদি অন্য কোনও গন্ধে যাওয়ার ইচ্ছা থাকে, তবে এর মতো নাল s === ''কেসটি স্বাধীনভাবে যাচাই করা উচিত:

var s = '';
new RegExp('(choice1|choice2' + (s ? '|' + regExpEscape(s) : '') + ')');

1
/মধ্যে পলান করা প্রয়োজন নেই [...]চরিত্র শ্রেণী।
ড্যান ড্যাসকলেসকু

1
এর মধ্যে বেশিরভাগকে পালানোর দরকার নেই। "একটি অক্ষর শ্রেণিতে একটি চরিত্রের সীমা তৈরি করে" - আপনি স্ট্রিংয়ের অভ্যন্তরে কোনও অক্ষর শ্রেণিতে থাকেন না। "ফ্রি স্পেসিং মোডে মন্তব্য নির্দিষ্ট করে, ফ্রি স্পেসিং মোডে উপেক্ষা করা হয়" - জাভাস্ক্রিপ্টে সমর্থিত নয়। "সংখ্যার নির্দিষ্টকরণে মানগুলি পৃথক করে" - আপনি কখনই স্ট্রিংয়ের অভ্যন্তরে সংখ্যার নির্দিষ্টকরণে থাকেন না are এছাড়াও আপনি নামের নির্দিষ্টকরণের ভিতরে স্বেচ্ছাসেবী পাঠ্য লিখতে পারবেন না। "প্রকাশ শুরু করে বা শেষ করে" - এড়াতে হবে না। ইভাল কোনও কেস নয়, কারণ এতে আরও বেশি পলায়নের প্রয়োজন হবে। [পরবর্তী মন্তব্যে অবিরত থাকবে]
কিওয়ারটি

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

@ কিওয়ার্টি এই অতিরিক্ত পলায়নের কারণ হ'ল প্রান্তের মামলাগুলি নির্মূল করা যা নির্দিষ্ট ব্যবহারের ক্ষেত্রে সমস্যা তৈরি করতে পারে। উদাহরণস্বরূপ, এই ফাংশনটির ব্যবহারকারী পালিয়ে যাওয়া রেজেক্স স্ট্রিংটিকে একটি গ্রুপের অংশ হিসাবে অন্য রেজেক্সে sertোকাতে বা জাভাস্ক্রিপ্টের পাশাপাশি অন্য কোনও ভাষাতে ব্যবহার করতে পারে। ফাংশনটি "আমি কখনই একটি চরিত্র শ্রেণীর অংশ হতে পারব না" এর মতো অনুমানগুলি তৈরি করে না, কারণ এটি সাধারণ বোঝানো হয়েছিল । আরও YAGNI পদ্ধতির জন্য, এখানে অন্য যে কোনও উত্তর দেখুন।
পাই মেরিলিয়ন

খুব ভালো. _ যদিও পালানো হয়নি? কোনটি নিশ্চিত করে যে এটি সম্ভবত পরবর্তী সময়ে রেজেেক্স সিনট্যাক্সে পরিণত হবে না?
ম্যাডপ্রপস

30

নিয়মিত অভিব্যক্তিগুলিতে মোজিলা বিকাশকারী নেটওয়ার্কের গাইড এই পালানোর কার্যটি সরবরাহ করে:

function escapeRegExp(string) {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}

@ ড্যানডাসকলেস্কু আপনি ঠিক বলেছেন এমডিএন পৃষ্ঠা আপডেট করা হয়েছে এবং =এটি আর অন্তর্ভুক্ত নেই।
চুপচাপ 16 ই

21

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

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

4
পার্থক্যটি হ'ল তারা পালিয়ে যায় ,(যা কোনও মেটাচার্যাক্টর নয়), এবং শ্বেত #স্পেস যা কেবলমাত্র ফ্রি-স্পেসিং মোডে গুরুত্বপূর্ণ (যা জাভাস্ক্রিপ্ট দ্বারা সমর্থিত নয়)। যাইহোক, ফরোয়ার্ড স্ল্যাশ থেকে বাঁচতে না পারা তারা ঠিক করে।
মার্টিন ইন্ডার

18
আপনি স্থানীয়ভাবে বদলে UI 'তে বাস্তবায়ন jQuery পুনরায় ব্যবহার কোড পেস্ট করুন করতে চান তাহলে, সঙ্গে যেতে $.ui.autocomplete.escapeRegex(myString)
স্কট স্টাফোর্ড

2
লডাশের এও আছে, _। এসগ্রিজেগ এক্সপ্যাক্ট এবং এনএমপিজেএস.
টেড

v1.12 একই, ঠিক আছে!
পিটার ক্রাউস

13

কোনও কিছুই আপনাকে কেবলমাত্র প্রতিটি অ-অক্ষরীয় অক্ষর থেকে পালাতে বাধা দেয় না:

usersString.replace(/(?=\W)/g, '\\');

করার সময় আপনি পাঠ্যতার একটি নির্দিষ্ট ডিগ্রী হারাবেন re.toString()তবে আপনি প্রচুর সরলতা এবং সুরক্ষা পান।

ECMA-262 অনুযায়ী, একদিকে নিয়মিত অভিব্যক্তি "সিনট্যাক্স অক্ষর" সবসময় অ আলফানিউমেরিক যেমন যে ফলাফলের নিরাপদ, এবং বিশেষ পালাবার ক্রম (হয়, \d, \w, \n) সবসময় আলফানিউমেরিক হয় যেমন যে কোন মিথ্যা নিয়ন্ত্রণ বেরিয়ে উত্পাদিত হবে ।


সহজ এবং কার্যকর। আমি এটি গ্রহণযোগ্য উত্তরের চেয়ে অনেক ভাল পছন্দ করি। (সত্যই) পুরানো ব্রাউজারগুলির জন্য,.replace(/[^\w]/g, '\\$&') একইভাবে কাজ করবে।
টমাস ল্যাংকাআস

6
এটি ইউনিকোড মোডে ব্যর্থ। উদাহরণস্বরূপ, new RegExp('🍎'.replace(/(?=\W)/g, '\\'), 'u')ব্যতিক্রম ছোঁড়ে কারণ \Wএকটি সারোগেট জোড়ের প্রতিটি কোড ইউনিটের সাথে আলাদাভাবে মেলে, ফলস্বরূপ অবৈধ অব্যাহতি কোড।
অ্যালেক্সি লেবেদেভ

1
বিকল্প:.replace(/\W/g, "\\$&");
মিগুয়েল পাইন্টো

@ অ্যালেক্সিলেবেদেভ হেস ইউনিকোড মোড পরিচালনা করতে উত্তর ঠিক করা হয়েছে? বা এই সরলতা বজায় রেখে অন্য কোথাও কোনও সমাধান রয়েছে যা?
জন কেন

11

RegExp.escape এর জন্য একটি ES7 প্রস্তাব রয়েছে https://github.com/benjamingr/RexExp.escape/ , এ polyfill উপলব্ধ https://github.com/ljharb/regexp.escape



6

এটি একটি সংক্ষিপ্ত সংস্করণ।

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

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


2
আমি এই "সংক্ষিপ্ত" সংস্করণটি ব্যবহার করব না, যেহেতু চরিত্র পরিসীমা অক্ষরের তালিকাটি গোপন করে, যা প্রথম নজরে সঠিকতা যাচাই করা আরও শক্ত করে তোলে।
nhahtdh

@ নাহহধঃ আমি সম্ভবত না চাই, তবে এটি তথ্যের জন্য এখানে পোস্ট করা হয়েছে।
kzh

@ কেজিঃ: "তথ্যের জন্য" পোস্ট করা বোঝার জন্য পোস্ট করার চেয়ে কম সহায়তা করে। আপনি কি আমার উত্তর পরিষ্কার হতে সম্মত হবেন না?
ড্যান ড্যাসক্লেস্কু

কমপক্ষে, .মিস করা হয়। এবং ()। অথবা না? [-^অদ্ভুত. কি আছে মনে নেই।
কিওয়ারটি

তারা নির্দিষ্ট পরিসীমা হয়।
কেজেড


3

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

এই উদাহরণস্বরূপ, নিম্নলিখিত অভিব্যক্তি ধরুন:

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

এই শ্বেত তালিকা অক্ষর, নম্বর এবং স্পেস:

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

রিটার্নস:

"be \|\| \! be"

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


@ ফিলিপের উত্তরের চেয়ে তার কি এই আলাদা? stackoverflow.com/a/40562456/209942
জনি কেন


1

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

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

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

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


ধরা যাক আপনি ব্যবহারকারীর ইনপুট থেকে বেরিয়ে (text)nextএটিকে (?:sertোকান : + ইনপুট + )। আপনার পদ্ধতিটি ফলস্বরূপ স্ট্রিং দেবে (?:\(text)next)যা সংকলন করতে ব্যর্থ। নোট করুন যে এটি যথেষ্ট যুক্তিসঙ্গত সন্নিবেশ, re\+ ইনপুট + এর মতো কোনও ক্রেজি নয় re(এই ক্ষেত্রে প্রোগ্রামারটিকে বোকা কিছু করার জন্য দোষ দেওয়া যেতে পারে)
nhahtdh

1
@ নাহহধঃ আমার জবাবটিতে বিশেষভাবে পুরো নিয়মিত অভিব্যক্তিগুলি এড়িয়ে যাওয়া এবং তাদের সাথে "সম্পন্ন করা" উল্লেখ করা হয়েছে, রেগেক্সপসের অংশগুলি (বা ভবিষ্যতের অংশগুলি) নয়। দয়া করে ডাউনভোটটি পূর্বাবস্থায় ফেরাবেন?
ড্যান ড্যাসক্লেস্কু

এটি খুব কমই ঘটে যায় যে আপনি সম্পূর্ণ অভিব্যক্তিটি এড়িয়ে যাবেন - স্ট্রিং অপারেশন রয়েছে, যা আপনি যদি আক্ষরিক স্ট্রিংয়ের সাথে কাজ করতে চান তবে রেজেক্সের তুলনায় অনেক দ্রুত হয়।
nhahtdh

এটি ভুল হিসাবে উল্লেখ করছে না - \পালানো উচিত, যেহেতু আপনার রেজেক্স \wঅক্ষত থাকবে। এছাড়াও, জাভাস্ক্রিপ্টটি অনুসরণ করার অনুমতি দেয় বলে মনে হয় না ), কমপক্ষে ফায়ারফক্স এর জন্য ত্রুটি নিক্ষেপ করে।
nhahtdh

1
বন্ধ করার অংশটি দয়া করে )
সম্বোধন করুন

1

আর একটি (অনেক বেশি নিরাপদ) পন্থাটি হল ইউনিকোড এস্কেপ ফর্ম্যাটটি ব্যবহার করে সমস্ত চরিত্রগুলি (এবং আমরা বর্তমানে জানি এমন কয়েকটি বিশেষ অক্ষর নয়) পালিয়ে যাওয়া \u{code}:

function escapeRegExp(text) {
    return Array.from(text)
           .map(char => `\\u{${char.charCodeAt(0).toString(16)}}`)
           .join('');
}

console.log(escapeRegExp('a.b')); // '\u{61}\u{2e}\u{62}'

দয়া করে নোট করুন যে uএই পদ্ধতির কাজ করার জন্য আপনার পতাকাটি পাস করতে হবে :

var expression = new RegExp(escapeRegExp(usersString), 'u');

1


আক্ষরিক হিসাবে বিবেচনা করার জন্য এখান থেকে কেবলমাত্র 12 টি মেটা অক্ষর রয়েছে এবং এড়াতে হবে।

পালানো স্ট্রিং দিয়ে কী করা হয় তা বিবেচনা
করে না, ভারসাম্য রেজেক্স মোড়কে endedোকানো, সংযুক্ত করা, কিছু যায় আসে না।

এটি ব্যবহার করে একটি স্ট্রিং প্রতিস্থাপন করুন

var escaped_string = oldstring.replace( /[\\^$.|?*+()[{]/g, '\\$&' );

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