আপনার নিজের টেক্সটের বিপরীতে JavaScript রেগুলার এক্সপ্রেশন পরীক্ষা করুন। g, i, m, s এবং u ফ্ল্যাগ টগল করুন, সূচক ও ক্যাপচার গ্রুপসহ প্রতিটি ম্যাচ পরিদর্শন করুন এবং প্রতিস্থাপনের ফলাফল লাইভ প্রিভিউ করুন।
আপনি টাইপ করার সময় প্রতিটি ম্যাচ, প্রতিটি গ্রুপ এবং প্রতিটি সূচক দেখুন। মেলানোর জন্য একটি প্যাটার্ন এবং কিছু টেক্সট লিখুন। প্রতিটি ফলাফল তার অবস্থান ও ক্যাপচার গ্রুপসহ তালিকাভুক্ত হয়, অবৈধ প্যাটার্ন ইঞ্জিনের নিজস্ব ত্রুটি বার্তা রিপোর্ট করে এবং প্রতিস্থাপন ক্ষেত্রটি দেখায় ঠিক কী একটি replace কল তৈরি করবে।
//g
ম্যাচগুলো–
ইঞ্জিন যেভাবে করে সেভাবে একটি রেগুলার এক্সপ্রেশন পড়া
ফ্ল্যাগ অর্থ পরিবর্তন করে, শুধু সার্চ নয়
পাঁচটি ফ্ল্যাগ পছন্দ নয়, তারা প্যাটার্ন পুনরায় সংজ্ঞায়িত করে। g ছাড়া, একটি সার্চ প্রথম ম্যাচটি ফেরত দেয় এবং থামে; সাথে, ইঞ্জিন একটি lastIndex কার্সর রাখে এবং পুরো স্ট্রিং জুড়ে চলে, যা কেন কল জুড়ে পুনরায় ব্যবহৃত একটি গ্লোবাল রেজেক্স ম্যাচ এড়িয়ে যেতে দেখা যায়। i ফ্ল্যাগ একটি সাধারণ ASCII স্থানান্তরের পরিবর্তে ইউনিকোড কেস ম্যাপিং ব্যবহার করে কেস ভাঁজ করে।
সবচেয়ে ভুল বোঝা দুটি হলো m এবং s। m শুধুমাত্র ^ এবং $-এর অর্থ পরিবর্তন করে, সেগুলোকে পুরো স্ট্রিংয়ের পরিবর্তে লাইন সীমানায় অ্যাংকর করে; এটি .-এর সাথে কিছু করে না। বিপরীতভাবে s শুধুমাত্র . পরিবর্তন করে, এটিকে একটি নিউলাইন মেলাতে দেয়। "dotall" নামটি মনে রাখার মতো দরকারী। u ফ্ল্যাগ প্যাটার্নটিকে UTF-16 ইউনিটের পরিবর্তে কোড পয়েন্টে পরিচালনা করে, তাই . একটি ইমোজিকে একটি ইউনিট হিসেবে মেলে এবং \u{1F600} এসকেপ বৈধ হয়ে যায়। এটি পূর্বে সহনীয় এসকেপগুলোও ত্রুটি করে, যা কেন একটি বিদ্যমান প্যাটার্ন আপনি এটি যোগ করার মুহূর্তে ভেঙে যেতে পারে।
গ্রুপ, সূচক এবং প্রতিস্থাপন
প্রতিটি বন্ধনীযুক্ত অংশ ডিফল্টরূপে ক্যাপচার করে, এর খোলা বন্ধনীর ক্রম অনুসারে সংখ্যায়িত হয়, এবং সেই সংখ্যাগুলোই প্রতিস্থাপনে $1 এবং $2 উল্লেখ করে। নেস্টিং একই নিয়ম অনুসরণ করে, তাই ((a)b)-তে গ্রুপ এক হলো ab এবং গ্রুপ দুই হলো a। যখন আপনি শুধুমাত্র অল্টারনেশন বা পুনরাবৃত্তির জন্য গ্রুপিং প্রয়োজন, (?:...) একটি ক্যাপচার বরাদ্দ এড়ায় এবং নম্বরকরণ পঠনযোগ্য রাখে।
প্রতিটি ম্যাচের জন্য রিপোর্ট করা সূচকটি হলো প্রথম ম্যাচ হওয়া অক্ষরের অফসেট, যা শোনার চেয়ে বেশি গুরুত্বপূর্ণ। এটি আপনাকে ভিন্ন অবস্থানে দুটি অভিন্ন ম্যাচ আলাদা করতে, একটি অ্যাংকর প্রত্যাশা মতো কাজ করেছে কিনা নিশ্চিত করতে এবং ক্লাসিক শূন্য-দৈর্ঘ্যের ম্যাচ নির্ণয় করতে দেয়। \d* এর মতো একটি প্যাটার্ন সর্বত্র খালি স্ট্রিং মেলে, তাই একটি গ্লোবাল স্ক্যান প্রতিটি অবস্থানে একটি ম্যাচ খুঁজে পায়; ইঞ্জিন শুধুমাত্র এগিয়ে যায় কারণ বাস্তবায়নগুলো ম্যাচ খালি হলে কার্সরকে সামনে বাধ্য করে।
ব্যাকট্র্যাকিং এবং ম্যাচ সীমা
JavaScript-সহ বেশিরভাগ ইঞ্জিন ব্যাকট্র্যাকিং ব্যবহার করে। প্যাটার্নের অংশ ব্যর্থ হলে, ইঞ্জিন শেষ সিদ্ধান্ত পয়েন্টে ফিরে যায় এবং আরেকটি পথ চেষ্টা করে। সাধারণত এটি অদৃশ্য। এটি বিপর্যয়কর হয়ে ওঠে যখন নেস্টেড কোয়ান্টিফায়ার পথের সংখ্যা সূচকীয়ভাবে বাড়ায়, ক্লাসিক আকৃতিটি হলো (a+)+b যার বিপরীতে b ছাড়া দীর্ঘ a অক্ষরের রান। সেই ইনপুট একটি ব্রাউজার ট্যাব ঝুলিয়ে দিতে পারে, এবং প্যাটার্নটি ব্যবহারকারীর ইনপুট থেকে আসলে এটি একটি ডিনায়াল-অফ-সার্ভিস ভেক্টর হয়ে যায়।
দুটি অভ্যাস প্রায় সবই এড়ায়: .*-এর উপরে নির্দিষ্ট ক্যারেক্টার ক্লাস পছন্দ করুন যাতে বিকল্পগুলো ওভারল্যাপ না করে, এবং যেখানে পারেন প্যাটার্ন অ্যাংকর করুন, কারণ একটি অ্যাংকর্ড ব্যর্থতা প্রতিটি অফসেটে পুনরায় চেষ্টা করার পরিবর্তে অবিলম্বে প্রত্যাখ্যাত হয়। এই টুলটি ফলাফল 500 ম্যাচে সীমাবদ্ধ করে এবং কখন এটি ট্রাঙ্কেট করেছে তা বলে, তাই একটি পলাতক প্যাটার্ন জমে যাওয়া পৃষ্ঠার পরিবর্তে একটি ধীর ফলাফলে পরিণত হয়।
সচরাচর জিজ্ঞাসা
এটি কোন রেজেক্স ফ্লেভার ব্যবহার করে?
JavaScript, অর্থাৎ আপনার ব্রাউজারে নির্মিত ECMAScript ইঞ্জিন। Perl, PCRE এবং Python প্যাটার্ন কাছাকাছি কিন্তু lookbehind, নামযুক্ত গ্রুপ এবং কিছু এসকেপে ভিন্ন।
g ফ্ল্যাগ আসলে কী পরিবর্তন করে?
এটি ছাড়া আপনি শুধুমাত্র প্রথম ম্যাচটি পান। এর সাথে ইঞ্জিন পুরো স্ট্রিং স্ক্যান করে এবং প্রতিটি ম্যাচ ফেরত দেয়, যা এখানে তালিকাটি পূরণ করে।
কেন আমি খালি ম্যাচ পাই?
আপনার প্যাটার্ন শূন্য অক্ষর মেলাতে পারে, যেমন `\d*` করে। একটি গ্লোবাল স্ক্যান তখন প্রতিটি অবস্থানে একটি ম্যাচ রিপোর্ট করে, এবং লুপিং এড়াতে ইঞ্জিন ম্যানুয়ালি এগিয়ে যায়।
প্রতিস্থাপনে ক্যাপচার গ্রুপ কীভাবে উল্লেখ করব?
প্রথম গ্রুপের জন্য $1, দ্বিতীয়ের জন্য $2 এবং সম্পূর্ণ ম্যাচের জন্য $& ব্যবহার করুন। একটি আক্ষরিক ডলার চিহ্ন প্রয়োজন হলে $$ লিখুন।
"প্রথম 500 দেখানো হচ্ছে" বলতে কী বোঝায়?
ফলাফল তালিকা 500 ম্যাচে সীমাবদ্ধ যাতে একটি খুব বিস্তৃত প্যাটার্ন পৃষ্ঠাটি জমে না ফেলে। প্রতিস্থাপন প্রিভিউ এখনও সম্পূর্ণ টেক্সটে প্রযোজ্য।
কেন আমার প্যাটার্ন পৃষ্ঠাটি ধীর করে?
(a+)+ এর মতো নেস্টেড কোয়ান্টিফায়ার সূচকীয় ব্যাকট্র্যাকিং ঘটায়। .* এর পরিবর্তে নির্দিষ্ট ক্যারেক্টার ক্লাস ব্যবহার করুন এবং ম্যাচিং রৈখিক রাখতে প্যাটার্নটি অ্যাংকর করুন।