রেগুলার এক্সপ্রেশন 30 মিনিটের মৌলিক পাঠ্যসূচি

রেগুলার এক্সপ্রেশন 30 মিনিটের মৌলিক পাঠ্যসূচি

লেখার উদ্দেশ্য

৩০ মিনিটের মধ্যে আপনাকে বুঝিয়ে দেব কীভাবে নিয়মিত অভিব্যক্তি (রেগুলার এক্সপ্রেশন) কাজ করে এবং এর কিছু মৌলিক ধারণা সম্পর্কে জানাব, যাতে আপনি এটি আপনার প্রোগ্রাম বা ওয়েবপৃষ্ঠায় ব্যবহার করতে পারেন।

এই টিউটোরিয়ালটি কীভাবে ব্যবহার করবেন

নীচে যে জটিল প্রকাশগুলি রয়েছে সেগুলি দেখে ভয় পাবেন না, শুধু আমার সাথে এক ধাপ এক ধাপ করে এগিয়ে চলুন, আপনি দেখতে পাবেন নিয়মিত প্রকাশগুলি আসলে আপনার কল্পনার চেয়ে ততটা কঠিন নয়। অবশ্যই, যদি আপনি এই পাঠ্যটি পড়ার পর বুঝতে পারেন যে আপনি অনেক কিছু জানেন, কিন্তু প্রায় কিছুই মনে রাখতে পারছেন না, তবে এটি স্বাভাবিক - আমি মনে করি, যারা নিয়মিত প্রকাশের সাথে পরিচিত নন, তাদের জন্য এই পাঠ্যটি পড়ার পর উল্লিখিত সিনট্যাক্সের ৮০% এরও বেশি মনে রাখার সম্ভাবনা শূন্য। এখানে কেবল আপনার মৌলিক নীতিগুলি বোঝানোর জন্য, ভবিষ্যতে আপনাকে আরও অনুশীলন করতে হবে এবং আরও ব্যবহার করতে হবে, তবেই আপনি নিয়মিত প্রকাশে দক্ষ হয়ে উঠতে পারবেন।

সবচেয়ে গুরুত্বপূর্ণ হল—দয়া করে আমাকে দিন ৩০ মিনিট যদি আপনার রেগুলার এক্সপ্রেশন ব্যবহারের অভিজ্ঞতা না থাকে, তবে 30-এ চেষ্টা করবেন না। সেকেন্ড ভেতরের দরজা——যদি তুমি সুপারম্যান না হও :)

এটির একটি প্রাথমিক পাঠ্যবই হিসাবে কাজ করার পাশাপাশি, এই নিবন্ধটি দৈনন্দিন কাজের জন্য ব্যবহারযোগ্য নিয়মিত অভিব্যক্তি সিনট্যাক্স রেফারেন্স ম্যানুয়াল হিসাবেও কাজ করার চেষ্টা করছে। লেখকের নিজস্ব অভিজ্ঞতার দিক থেকে, এই লক্ষ্যটি বেশ ভালভাবে সম্পন্ন হয়েছে—দেখুন, আমি নিজেও সবকিছু মনে রাখতে পারিনি, তাই না?

ফরম্যাট মুছে ফেলুন পাঠ্য ফরম্যাট চুক্তি: পেশাদারী পরিভাষা মেটা অক্ষর/ব্যাকরণ বিন্যাস নিয়মিত অভিব্যক্তি নিয়মিত অভিব্যক্তির একটি অংশ (বিশ্লেষণের জন্য) সেটির সাথে মিলে যাওয়া উৎস স্ট্রিং নিয়মিত অভিব্যক্তি বা এর একটি অংশের ব্যাখ্যা

গোপন প্রান্ত মন্তব্য লেখাটির ডান দিকে কিছু মন্তব্য রয়েছে, যা প্রধানত কিছু সম্পর্কিত তথ্য সরবরাহ করতে বা প্রোগ্রামার পটভূমি নেই এমন পাঠকদের জন্য কিছু মৌলিক ধারণা ব্যাখ্যা করতে ব্যবহৃত হয়, সাধারণত এগুলি উপেক্ষা করা যেতে পারে।

রেগুলার এক্সপ্রেশন আসলে কি?

স্ট্রিং প্রক্রিয়াকরণের প্রোগ্রাম বা ওয়েবপেজ তৈরি করার সময়, প্রায়ই কিছু জটিল নিয়ম মেনে চলে এমন স্ট্রিং খুঁজে বের করার প্রয়োজন পড়ে। নিয়মিত অভিব্যক্তি এটি এই নিয়মগুলি বর্ণনা করার জন্য ব্যবহৃত একটি হাতিয়ার। অন্য কথায়, নিয়মিত প্রকাশ হল টেক্সটের নিয়মগুলি রেকর্ড করার কোড।

এটি সম্ভবত আপনি Windows/Dos এর অধীনে ফাইল খোঁজার জন্য ব্যবহার করেছেন। ওয়ার্ড (Wildcard) wildcard ) অর্থাৎ * এবং ? যদি আপনি কোনও ডিরেক্টরির সমস্ত Word ডকুমেন্ট খুঁজে পেতে চান, তাহলে আপনি অনুসন্ধান করবেন। * .doc এখানে, * যা যেকোনো স্ট্রিং হিসাবে ব্যাখ্যা করা যেতে পারে। ওয়ার্ডওয়াইল্ডারের মতো, নিয়মিত অভিব্যক্তি একটি টেক্সট ম্যাচিং টুল, তবে ওয়ার্ডওয়াইল্ডারের তুলনায় এটি আপনার প্রয়োজনীয়তা আরও সঠিকভাবে বর্ণনা করতে পারে - অবশ্যই, এর জন্য মূল্য হলো এটি আরও জটিল - যেমন আপনি একটি নিয়মিত অভিব্যক্তি লিখতে পারেন, যা খুঁজে পেতে পারে। সবগুলো 0 দিয়ে শুরু হয়, পরে 2-3টি সংখ্যা থাকে, তারপর একটি হাইফেন "-" থাকে, এবং শেষ পর্যন্ত 7 বা 8টি সংখ্যা থাকে এমন স্ট্রিং। (যেমন 010-12345678 অথবা 0376-7654321 )。

অক্ষর এটি কম্পিউটার সফটওয়্যার দ্বারা লেখা প্রক্রিয়াকরণের সময় সবচেয়ে মৌলিক একক, যা হতে পারে অক্ষর, সংখ্যা, বিরাম চিহ্ন, ফাঁকা স্থান, নতুন লাইন চিহ্ন, চীনা অক্ষর ইত্যাদি। স্ট্রিং এটি 0 টি বা তার বেশি অক্ষরের একটি সিকোয়েন্স। পাঠ্য অর্থাৎ লেখা, স্ট্রিং। একটি স্ট্রিং বলা। ম্যাচ করা একটি নিয়মিত অভিব্যক্তি সাধারণত বোঝায় যে এই স্ট্রিংটিতে একটি অংশ (অথবা একাধিক অংশ) রয়েছে যা প্রকাশনার দ্বারা দেওয়া শর্তগুলি পূরণ করতে পারে।

প্রবেশদ্বার

নিয়মিত অভিব্যক্তি শেখার সবচেয়ে ভালো উপায় হল উদাহরণ দিয়ে শুরু করা, উদাহরণগুলি বোঝার পরে সেগুলি পরিবর্তন করা এবং পরীক্ষা করা। নিচে বেশ কিছু সহজ উদাহরণ দেওয়া হয়েছে এবং সেগুলোর বিস্তারিত ব্যাখ্যা করা হয়েছে।

ধরি তুমি একটি ইংরেজি উপন্যাসে খুঁজছো। hi আপনি নিয়মিত অভিব্যক্তি ব্যবহার করতে পারেন। hi

এটি প্রায় সবচেয়ে সহজ রেগুলার এক্সপ্রেশন, যা এই ধরনের স্ট্রিং সঠিকভাবে মেলাতে পারে: দুটি অক্ষর নিয়ে গঠিত, প্রথম অক্ষর হলো h, দ্বিতীয়টি হলো i। সাধারণত, রেগুলার এক্সপ্রেশন প্রক্রিয়াকরণের সরঞ্জামগুলি একটি কেস-সংবেদনশীলতা উপেক্ষা করার অপশন প্রদান করে, যদি এই অপশনটি নির্বাচিত হয় তবে এটি মেলাতে পারে। hi , HI , Hi , hI এই চারটি পরিস্থিতির যেকোনো একটি।

দুর্ভাগ্যবশত, অনেক শব্দে অন্তর্ভুক্ত আছে। hi এই দুটি ধারাবাহিক অক্ষর, যেমন him , history , high অপেক্ষা করুন। hi এখানে যা খুঁজতে এসেছেন, তাতে অন্তর্ভুক্ত। hi এটিও বের করা হবে। যদি করতে হয় "hi" শব্দটি সঠিকভাবে খুঁজুন। আমাদের উচিত ব্যবহার করা \bhi\b

\b এটি নিয়মিত অভিব্যক্তি দ্বারা নির্ধারিত একটি বিশেষ কোড (ভাল, কিছু লোক এটিকে বলে) মেটা অক্ষর, metacharacter ), প্রতিনিধিত্ব করে শব্দের শুরু বা শেষ, অর্থাৎ শব্দের সীমানা স্থল। যদিও সাধারণত ইংরেজি শব্দগুলি ফাঁকা স্থান, বিরামচিহ্ন বা নতুন লাইনের মাধ্যমে পৃথক করা হয়, তবে \b এগুলো শব্দের বিভাজক চিহ্নগুলোর মধ্যে কোনোটির সাথে মেলেনা, এটি। শুধু একটি স্থানে মেলানো

যদি আপনি যা খুঁজছেন তা হলো হাইয়ের পর একটু দূরে একটি লুসি আছে। তুমি উচিত ব্যবহার করতে \bhi\b.*\bLucy\b

যদি আরও সঠিকভাবে বলতে হয়, \b এমন একটি অবস্থান মেলান: এর পূর্ববর্তী চরিত্র এবং পরবর্তী চরিত্র পুরোপুরি (একটি আছে, একটি নেই বা অস্তিত্ব নেই) নয়। \w

এখানে, . একটি অন্য মেটা চরিত্র, যা মেলায়। নতুন লাইন চিহ্ন ছাড়া যেকোনো অক্ষর এটি একটি মেটা অক্ষর, তবে এটি অক্ষর বা অবস্থান নয়, বরং পরিমাণ নির্দেশ করে - এটি নির্দিষ্ট করে। * আগের বিষয়বস্তু যেকোনো বার পুনরাবৃত্তি করা যেতে পারে যাতে সম্পূর্ণ প্রকাশটি মেলানো যায়। অতএব,। * একত্রিত হওয়া মানে হল যে কোনও সংখ্যা অক্ষর যা নতুন লাইনে বিভক্ত নয়। এখন \bhi\b. * \bLucy\b এর অর্থ খুব স্পষ্ট: হাইLucy

যদি একসাথে অন্যান্য মেটা ক্যারেক্টার ব্যবহার করা হয়, তাহলে আমরা আরও শক্তিশালী নিয়মিত অভিব্যক্তি তৈরি করতে পারি। উদাহরণস্বরূপ নিচের উদাহরণটি:

0\d\d-\d\d\d\d\d\d\d\d এমন স্ট্রিং মেলানো: ০ দিয়ে শুরু হয়ে, তারপর দুটি সংখ্যা, তারপর একটি সংযোগ চিহ্ন “-”, শেষের দিকে ৮টি সংখ্যা। (অর্থাৎ, চীনের ফোন নম্বর। অবশ্যই, এই উদাহরণটি শুধুমাত্র 3 সংখ্যার কোটির জন্য প্রযোজ্য)।

换行符就是'\n',ASCII编码为10(十六进制 0x0A ) এর অক্ষর।

এখানে \d এটি একটি নতুন মেটা ক্যারেক্টার, ম্যাচ করে একটি সংখ্যা (0, বা 1, বা 2, বা……) )।-এটি একটি মেটা চরিত্র নয়, এটি কেবল নিজেই মেলায় - হাইফেন (অথবা কমা, অথবা মিডিল, অথবা আপনি যেভাবে এটি নামেন)।

এতো বিরক্তিকর পুনরাবৃত্তি এড়াতে, আমরা এই প্রকাশটি এমনভাবে লিখতে পারি: 0\d{2}-\d{8} এখানে \d পিছনের{ 2 }({ 8 })এর অর্থ হলো সামনে। \d ধারণা অনুযায়ী ২ বার (৮ বার) ধারাবাহিকভাবে মেলানো আবশ্যক।

রেগুলার এক্সপ্রেশন পরীক্ষা

যদি আপনি মনে না করেন যে নিয়মিত প্রকাশনা পড়া বা লেখা কঠিন, তবে হয়তো আপনি একজন প্রতিভা, অথবা আপনি পৃথিবীর বাসিন্দা নন। নিয়মিত প্রকাশনার ব্যাকরণ খুবই জটিল, এমনকি যারা প্রায়শই এটি ব্যবহার করেন তাদের জন্যও। পড়া বা লেখা কঠিন হওয়ার কারণে এবং ভুল করা সহজ হওয়ায়, নিয়মিত প্রকাশনা পরীক্ষা করার জন্য একটি সরঞ্জাম খোঁজা খুবই প্রয়োজনীয়।

অন্যান্য উপলব্ধ পরীক্ষার সরঞ্জাম:

বিভিন্ন পরিবেশে নিয়মিত প্রকাশের কিছু বিস্তারিত ভিন্ন হয়, এই টিউটোরিয়ালে মাইক্রোসফট .Net Framework 4.0 এর অধীনে নিয়মিত প্রকাশের আচরণ সম্পর্কে আলোচনা করা হয়েছে, তাই আমি আপনাকে আমার দ্বারা লেখা .Net এর অধীনে টুলটি সুপারিশ করছি। রেগুলার এক্সপ্রেশন টেস্টার দয়া করে এই পৃষ্ঠার নির্দেশনা অনুসরণ করুন সফটওয়্যারটি ইনস্টল এবং চালানোর জন্য।

নিচে Regex Tester চালানোর সময়ের স্ক্রীনশট:

regex_tester

মেটাচরিত্র

এখন আপনি কয়েকটি খুবই উপকারী মেটা অক্ষর জানেন, যেমন \b , . , * এবং \d .নিয়মিত অভিব্যক্তিতে আরও অনেক মেটা অক্ষর রয়েছে, যেমন \s ম্যাচ করা যেকোনো খালি চিহ্ন, যার মধ্যে স্থান, ট্যাব (Tab), নতুন লাইন চিহ্ন, চীনা পূর্ণ প্রস্থের খালি স্থান ইত্যাদি অন্তর্ভুক্ত। \w ম্যাচ করা অক্ষর বা সংখ্যা বা আন্ডারস্কোর বা চীনা অক্ষর ইত্যাদি

নিচে আরও উদাহরণ দেখা যাক:

\ba\w * \b অক্ষর দ্বারা মিলানো a শুরুর শব্দ——প্রথমে একটি শব্দের শুরুস্থলে( \b ),তারপর অক্ষর a , তারপর যে কোনও সংখ্যা অক্ষর বা সংখ্যা( \w * ), শেষ হল শব্দের শেষ অংশ( \b )。

চীনা ভাষা/হানজির বিশেষ ব্যবস্থাপনা .Net দ্বারা প্রদত্ত নিয়মিত অভিব্যক্তি ইঞ্জিন দ্বারা সমর্থিত, অন্যান্য পরিবেশের নির্দিষ্ট পরিস্থিতির জন্য দয়া করে সংশ্লিষ্ট নথি দেখুন।

ঠিক আছে, এখন আমরা বলি যে নিয়মিত অভিব্যক্তিতে শব্দগুলোর মানে কি: অর্থাৎ হল একটির বেশি ধারাবাহিক \w। বেশ, এটি ইংরেজি শেখার সময় হাজার হাজার একই নামের জিনিসগুলির সাথে আসলেই খুব কম সম্পর্কিত :)

\d+ ম্যাচ করা 1টি বা তার বেশি ধারাবাহিক সংখ্যা এখানে + এবং * সাদৃশ মেটা চরিত্র, পার্থক্য হলো * ম্যাচ করুন পুনরাবৃত্তি যেকোনো সংখ্যায় (শূন্যবারও হতে পারে), কিন্তু + মিলছে একবার বা তার বেশি বার পুনরাবৃত্তি করুন

\b\w{6}\b ম্যাচ করা ঠিক ৬টি অক্ষরের শব্দ

কোড বিবরণ
. লাইন বিরতি বাদে যেকোনো অক্ষর মেলান
\w অক্ষর বা সংখ্যা বা আন্ডারস্কোর বা চীনা অক্ষর মেলান
\s যেকোনো ফাঁকা চিহ্ন মেলানো
\d সংখ্যা মেলানো
\b শব্দের শুরু বা শেষ মেলানো
^ স্ট্রিংয়ের শুরু মেলানো
$ স্ট্রিংয়ের শেষ মেলানো

মেটাচরিত্র ^ এবং $ সবাই একটি অবস্থানে মেলে, এটা এবং \b একটু অনুরূপ। ^ আপনার অনুসন্ধানের জন্য যে স্ট্রিংটি ব্যবহার করতে চান তার শুরুতে মেলান। $ মিলানো শেষ। এই দুটি কোড ইনপুটের বিষয়বস্তু যাচাই করতে খুব উপকারী, যেমন একটি ওয়েবসাইট যদি আপনার পূরণ করা QQ নম্বর 5 থেকে 12 ডিজিটের মধ্যে হতে হবে তাহলে আপনি ব্যবহার করতে পারেন: ^\d{5,12}$

এখানে { 5,12 } এবং পূর্বে পরিচিত { 2 }এটি অনুরূপ, কেবলমাত্র { 2 }ম্যাচ শুধু দুইবার ঠিক ঠিক পুনরাবৃত্তি করতে হবে। ,{ 5,12 } হল পুনরাবৃত্তির সংখ্যা ৫টির কম হতে পারবে না এবং ১২টির বেশি হতে পারবে না। অন্যথায় সবকিছু অমিল হবে।

নিয়মিত অভিব্যক্তি ইঞ্জিন সাধারণত একটি "নির্দিষ্ট স্ট্রিং একটি নিয়মিত অভিব্যক্তির সাথে মেলে কিনা তা পরীক্ষা করার" পদ্ধতি প্রদান করে, যেমন জাভাস্ক্রিপ্টে। RegExp.test() পদ্ধতি বা .NET এর Regex.IsMatch() পদ্ধতি। এখানে মেলানো মানে হলো স্ট্রিংয়ের মধ্যে কি কোন অংশ আছে যা প্রকাশের নিয়ম মেনে চলে। যদি ব্যবহার না করা হয় ^ এবং $ এর জন্য \d{5,12} এতে করে, এই পদ্ধতি ব্যবহার করে কেবল নিশ্চিত করা যায় যে স্ট্রিংয়ের মধ্যে অন্তর্ভুক্ত আছে ৫ থেকে ১২ এর মধ্যে ধারাবাহিক সংখ্যা এবং পুরো স্ট্রিংটি ৫ থেকে ১২ ডিজিটের নয়।

কারণ ব্যবহার করা হয়েছে ^ এবং $ তাহলে প্রবেশ করা পুরো স্ট্রিংটি ব্যবহার করতে হবে এবং \d{5,12} মিলিয়ে আসুন, অর্থাৎ পুরো ইনপুটটি অবশ্যই হতে হবে ৫ থেকে ১২ সংখ্যার সুতরাং, যদি ইনপুটের QQ নম্বরটি এই নিয়মিত অভিব্যক্তির সাথে মেলে, তাহলে এটি প্রয়োজনীয়তার সাথে মেলে।

এবং অক্ষরের ক্ষেত্রে বৃহত্তম ও ক্ষুদ্রতমের বিকল্পের মতো, কিছু নিয়মিত অভিব্যক্তি প্রক্রিয়াকরণ সরঞ্জামে একটি বহু-লাইন পরিচালনার বিকল্পও রয়েছে। যদি এই বিকল্পটি নির্বাচন করা হয়, ^ এবং $ এর অর্থ হয়ে যায় ম্যাচিং লাইনের শুরু এবং শেষ।

অক্ষর পাল্টানো

যদি আপনি মেটা চরিত্রগুলি নিজেই খুঁজতে চান, যেমন আপনি খুঁজছেন ., অথবা *, তাহলে সমস্যা দেখা দেবে: আপনি সেগুলিকে নির্দিষ্ট করতে পারবেন না, কারণ এগুলি অন্য অর্থে ব্যাখ্যা করা হবে। এই অবস্থায় আপনাকে এই চরিত্রগুলির বিশেষ অর্থ বাতিল করতে \ ব্যবহার করতে হবে। তাই আপনাকে ব্যবহার করতে হবে . এবং \ * অবশ্যই, \এর নিজস্ব অনুসন্ধান করতে হলে, আপনাকেও ব্যবহার করতে হবে। \ \ .

যেমন: unibetter \ .com ম্যাচ করা unibetter.com >C: \ Windows ম্যাচ করা C:\Windows

পুনরাবৃত্তি

তুমি ইতিমধ্যে আগেরটি দেখেছ। * , + , {2} , {2,5} এই কয়েকটি মিলন পুনরাবৃত্তির পদ্ধতি। নিচে নিয়মিত অভিব্যক্তিতে সমস্ত সীমাবদ্ধতার তালিকা (নির্দিষ্ট সংখ্যার কোড, যেমন *, {5,12} ইত্যাদি):

কোড/ব্যাকরণ বিবরণ
* শূন্য বা তার বেশি বার পুনরাবৃত্তি করুন
+ একবার বা একাধিকবার পুনরাবৃত্তি করুন।
? শূন্য বা একবার পুনরাবৃত্তি করুন।
{n} n বার পুনরাবৃত্তি করুন
{n,} n বার বা তার বেশি বার পুনরাবৃত্তি করুন
{m,m} n থেকে m বার পুনরাবৃত্তি করুন

নিচে কিছু পুনরাবৃত্তি ব্যবহার করার উদাহরণ দেওয়া হলো:

Windows\d+ ম্যাচ করা Windows এর পর 1 টি বা তার বেশি সংখ্যা।

^\w+ ম্যাচ করা এক লাইনের প্রথম শব্দ (অথবা সম্পূর্ণ স্ট্রিংয়ের প্রথম শব্দ, নির্দিষ্টভাবে কোনটি মেলানো হবে তা বিকল্প সেটিংসের উপর নির্ভর করে)

অক্ষর শ্রেণী

সংখ্যা, অক্ষর বা সংখ্যা অনুসন্ধান করা সহজ, কারণ এই অক্ষরের জন্য ইতিমধ্যে সংশ্লিষ্ট আছে। * * এর মেটা ক্যারেক্টার, কিন্তু যদি আপনি পূর্বনির্ধারিত মেটা ক্যারেক্টার নেই এমন ক্যারেক্টার ম্যাচ করতে চান। * * (যেমন স্বরবর্ণ a, e, i, o, u) কী করা উচিত?

[এটা খুব সহজ, তুমি শুধু তাদের কোষ্ঠকাঠিন্যের মধ্যে তালিকা করতে হবে, যেমন] [aeiou] মিলিয়ে দেওয়া কোনও একটি ইংরেজি স্বরবর্ণ [.?!] ম্যাচ করা চিহ্ন (। অথবা? অথবা!)

আমরা সহজেই একটি অক্ষর নির্দিষ্ট করতে পারি। পরিধি য much [0-9] প্রতিনিধিত্বের অর্থ এবং \d এটি সম্পূর্ণরূপে সঙ্গতিপূর্ণ। একটি সংখ্যা একইভাবে [a-z0-9A-Z_] এটাও সম্পূর্ণরূপে সমান। \w (যদি শুধুমাত্র ইংরেজি বিবেচনা করা হয়)।

নিচে একটি আরও জটিল প্রকাশ রয়েছে: \ (?0\d{2}[) -]?\d{8}

এই অভিব্যক্তিটি মেলানো যায়। ফোন নম্বরের বিভিন্ন ফরম্যাট য much (010)88886666 বা 022-22334455 বা 02912345678 অপেক্ষা করুন। আমরা এর কিছু বিশ্লেষণ করি: প্রথমে একটি এস্কেপ ক্যারেক্টার। \ (এটি 0 বার বা 1 বার উপস্থিত হতে পারে( ? ), তারপর একটি 0 , পিছনে 2টি সংখ্যা আছে( \d{2} ),তারপর ) অথবা - অথবা ফাঁকা স্থান এর মধ্যে একটি, এটি 1 বার বা উপস্থিত নাও থাকতে পারে( ? ), শেষের দিকে ৮টি সংখ্যা( \d{8} )。

“(” এবং “)” ও একটি মেটা ক্যারেক্টার, পরবর্তী গ্রুপ উৎসব এখানে উল্লেখ করা হবে, তাই এখানে ব্যবহার করা প্রয়োজন। রূপান্তর

শাখা শর্ত

দুর্ভাগ্যবশত, একটু আগে যে প্রকাশটি ছিল সেটিও মিলে যেতে পারে। 010)12345678 অথবা (022-87654321 এমন "ভুল" ফরম্যাট। এই সমস্যা সমাধানের জন্য, আমাদের প্রয়োজন হবে শাখা শর্ত রেগুলার এক্সপ্রেশনে শাখা শর্ত এর মানে হল যে কয়েকটি নিয়ম রয়েছে, যদি এর মধ্যে কোন একটি নিয়মও মেনে চলে তবে সেটিকে মেলানো হিসাবে গণ্য করা উচিত। নির্দিষ্ট পদ্ধতি হল | দিয়ে বিভিন্ন নিয়ম আলাদা করা। বোঝা যাচ্ছে না? চিন্তা করবেন না, উদাহরণ দেখুন:

0\d{2}-\d{8}|0\d{3}-\d{7} এই অভিব্যক্তিটি সক্ষম। দুটি হাইফেন দ্বারা পৃথক টেলিফোন নম্বর মেলানো: একটি তিন অঙ্কের অঞ্চল কোড এবং ৮ অঙ্কের স্থানীয় নম্বর (যেমন 010-12345678), একটি চার অঙ্কের অঞ্চল কোড এবং ৭ অঙ্কের স্থানীয় নম্বর (0376-2233445)।

\ (0\d{2} ) [- ]?\d{8}|0\d{2}[- ]?\d{8} এই প্রকাশনাটি 3 ডিজিটের অঞ্চল কোডের ফোন নম্বর মেলানো, যেখানে অঞ্চল কোডটি ছোট বন্ধনীতে থাকতে পারে, অথবা না-ও থাকতে পারে, অঞ্চল কোড এবং স্থানীয় নম্বরের মধ্যে ড্যাশ বা স্পেস দ্বারা পৃথক করা যেতে পারে, অথবা কোন পৃথকীকরণও থাকতে নাও পারে। আপনি এই অভিব্যক্তিটি শাখা শর্ত ব্যবহার করে 4 ডিজিটের অঞ্চল কোড সমর্থন করার জন্য প্রসারিত করার চেষ্টা করতে পারেন।

\ d{5}-\d{4}|\d{5} এই প্রকাশটি মার্কিন যুক্তরাষ্ট্রের ডাক কোড মেলানোর জন্য ব্যবহৃত হয়। মার্কিন ডাক কোডের নিয়ম হল 5টি সংখ্যা, অথবা হাইফেন দ্বারা পৃথক 9টি সংখ্যা। এই উদাহরণটি দেওয়ার কারণ হল এটি একটি সমস্যাকে ব্যাখ্যা করতে সক্ষম: শাখা শর্ত ব্যবহার করার সময়, প্রতিটি শর্তের ক্রমের প্রতি মনোযোগ দিতে হবে। যদি তুমি এটাকে পরিবর্তন করো \ d{5}|\d{5}-\d{4} তাহলে এটি শুধুমাত্র ৫ ডিজিটের ডাক কোড (এবং ৯ ডিজিটের ডাক কোডের প্রথম ৫ ডিজিট) ম্যাচ করবে। কারণ শাখা শর্তগুলির সাথে মেলানোর সময়, প্রতিটি শর্তকে বাম থেকে ডানে পরীক্ষা করা হবে, যদি একটি শাখা পূর্ণ হয় তবে অন্য শর্তগুলির দিকে আর নজর দেওয়া হবে না।

গ্রুপ করা

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

(\d{1,3} . ){3}\d{1,3} এটি একটি সহজ। IP ঠিকানা মেলানো ব্যক্তিত্ব। এই ব্যক্তিত্বটি বুঝতে, দয়া করে নীচের ক্রমে এটি বিশ্লেষণ করুন: \d{1,3} ১ থেকে ৩ সংখ্যার সাথে মেলে এমন (\d{1,3} \ .){3} ম্যাচ করা তিনটি সংখ্যা যোগ করে একটি ইংরেজি পূর্ণবিরাম চিহ্ন (এই পুরো বিষয়টিও এই) গ্রুপ করা ) তিনবার পুনরাবৃত্তি করুন শেষে আবার যোগ করুন একটি এক থেকে তিন অঙ্কের সংখ্যা \ d{1,3} )

দুর্ভাগ্যবশত, এটিও মেলাবে। 256.300.888.999 এমন একটি অপ্রাকৃত IP ঠিকানা। যদি গণিতের তুলনা ব্যবহার করা সম্ভব হতো, তাহলে হয়তো এই সমস্যাটি সহজেই সমাধান করা যেত, কিন্তু নিয়মিত অভিব্যক্তিতে গণিত সম্পর্কিত কোনো কার্যকারিতা নেই, তাই সঠিকভাবে বর্ণনা করার জন্য দীর্ঘ গ্রুপ, নির্বাচন, অক্ষর শ্রেণী ব্যবহার করতে হবে। IP ঠিকানা: ((2[0-4]\d|25[0-5]|[01]?\d\d?) \ .){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

আইপি ঠিকানার প্রতিটি সংখ্যা 255-এর বেশি হতে পারে না, সবাইকে সাবধান হতে হবে 《24》 এর তৃতীয় মৌসুমের চিত্রনাট্যকারের দ্বারা বিভ্রান্ত না হতে……

এই প্রকাশনার মূল হল বোঝা 2[0-4]\d|25[0-5]|[01]?\d\d? এখানে আমি বিস্তারিত বলব না, তুমি নিশ্চয়ই এর অর্থ বিশ্লেষণ করতে পারবে।

বিপরীত

কখনও কখনও এমন অক্ষর খুঁজতে হয় যা সহজভাবে সংজ্ঞায়িত অক্ষর শ্রেণীতে পড়ে না। উদাহরণস্বরূপ, সংখ্যা ছাড়া অন্য যেকোনো অক্ষর খুঁজতে চাইলে, তখন এটি ব্যবহার করতে হয়। বিপরীত

কোড/ব্যাকরণ বিবরণ
\W যেকোনো অক্ষর যা অক্ষর, সংখ্যা, আন্ডারস্কোর বা চীনা অক্ষর নয় তা মেলান।
\S যেকোনো খালি অক্ষর নয় এমন অক্ষর মেলানো
\D যেকোনো অ সংখ্যা অক্ষরের সাথে মেলানো
\B শব্দের শুরু বা শেষের অবস্থান নয়।
[^x] x ছাড়া যেকোনো অক্ষর মেলে
[^aeiou] aeiou ছাড়া যেকোনো অক্ষরের সাথে মিলে যায়।

উদাহরণ: \S+ শূন্যস্থান ছাড়া স্ট্রিং ম্যাচ করুন।

<a[^> ] +> এমন স্ট্রিংগুলি যা < দিয়ে শুরু এবং a দিয়ে শুরু হয় সেগুলি ম্যাচ করুন।

পেছনের উদ্ধৃতি

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

পেছনের উদ্ধৃতি আগের কোনো গ্রুপের সাথে মিলে যাওয়া টেক্সট পুনরাবৃত্তি অনুসন্ধানের জন্য ব্যবহৃত হয়। উদাহরণস্বরূপ, \1 প্রতিনিধি গ্রুপ 1 এর মেলানো পাঠ্য কষ্টকর বোঝা? উদাহরণ দেখুন:

\b(\w+)\b\s+\1\b দ্বিতীয় শব্দ মেলানোর জন্য ব্যবহার করা যেতে পারে, যেমন go go বা kitty kitty এই প্রকাশটি প্রথমে হল একটি শব্দ অর্থাৎ শব্দের শুরু এবং শেষের মধ্যে একাধিক অক্ষর বা সংখ্যা (\b(\w+)\b) এই শব্দটি সংখ্যা ১ এর গ্রুপে ধরা পড়বে, তারপর হচ্ছে 1 বা একাধিক ফাঁকা চিহ্ন ( \s+ ), শেষে হচ্ছে গ্রুপ 1-এ ধরা পড়া বিষয়বস্তু (অর্থাৎ আগের সাথে মেলে এমন শব্দটি) \1 )

এম... আসলে, গ্রুপ নম্বর বরাদ্দ করা এত সহজ নয় যেমন আমি আগে বলেছিলাম:

  • গ্রুপ 0 পুরো নিয়মিত অভিব্যক্তিকে বোঝায়।
  • বাস্তবিকপক্ষে, গ্রুপ নম্বর বরাদ্দ প্রক্রিয়াটি বাম থেকে ডানে দুটি বার স্ক্যান করা দরকার: প্রথমবার কেবল অ-নামক গ্রুপকে বরাদ্দ দেওয়া হয়, দ্বিতীয়বার কেবল নামকৃত গ্রুপকে বরাদ্দ দেওয়া হয় - তাই সব নামকৃত গ্রুপের গ্রুপ নম্বর অ-নামক গ্রুপের নম্বরের চেয়ে বড়।
  • আপনি (?:exp) এর মতো সিনট্যাক্স ব্যবহার করতে পারেন একটি গ্রুপকে গ্রুপ নম্বর বরাদ্দের অধিকার থেকে বঞ্চিত করতে।

আপনি নিজেই উপ-প্রকাশের নির্বাচন করতে পারেন। দলনাম একটি উপ-expressions এর গ্রুপ নাম নির্ধারণ করতে, এই ধরনের সিনট্যাক্স ব্যবহার করুন: ( ? < Word>\w+ )(或者把尖括号换成'也行:( ?'Word'\w+ এভাবে এটা把 \w+ গ্রুপের নাম নির্ধারণ করা হয়েছে Word এই গ্রুপটি উল্টো উদ্ধৃত করতে হবে। ধরা এর বিষয়বস্তু, আপনি ব্যবহার করতে পারেন \k < Word> তাহলে আগের উদাহরণটি এইভাবে লেখা যেতে পারে: \b(? < Word>\w+)\b\s+\k < Word>\b

কোণাকৃতি বন্ধনী (小括号) ব্যবহারের সময় অনেক নির্দিষ্ট উদ্দেশ্যের ব্যাকরণ রয়েছে। নিচে সবচেয়ে সাধারণ কয়েকটি তালিকাভুক্ত করা হলো:

আমরা প্রথম দুটি ব্যাকরণ নিয়ে আলোচনা করেছি। তৃতীয়টি( ?:exp ) এটি নিয়মিত এক্সপ্রেশন প্রক্রিয়াকরণের পদ্ধতি পরিবর্তন করবে না, কেবল এভাবে গোষ্ঠী মেলানো বিষয়বস্তুগুলি প্রথম দুটি ধরনের মতো কোনও গোষ্ঠীর মধ্যে ধরা হবে না এবং গোষ্ঠী সংখ্যা থাকবে না। "আমি কেন এটি করতে চাই?" - ভালো প্রশ্ন, আপনি মনে করেন কেন?

শূন্য প্রস্থের দাবি

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

(?=exp) এবং বলা হয় শূন্য প্রস্থের ইতিবাচক পূর্বাভাস অগ্রভাগ দাবি এটি একটি অবস্থানে নিজেকে দাবি করা যে সেখানে exp প্রকাশনার সাথে মিলে যাবে। যেমন \b\w+(?=ing\b) মিলানো দ্বারা ing শেষের শব্দের সামনে অংশ (ছাড়া ing বাকী অংশ) যদি খোঁজেন I'm singing while you're dancing. এটি মেলাবে sing এবং danc

(?<=exp) এবং বলা হয় জিরো-উইডথ পজিটিভ রিভিউ পরে প্রকাশিত দাবী এটি স্বয়ংক্রিয়ভাবে উপস্থিতির অবস্থানের সামনে অভিব্যক্তি exp মেলাতে পারে। যেমন( ?<=\bre)\w+\b মিলবে দিয়ে re শুরু হওয়া শব্দের দ্বিতীয় অর্ধাংশ (re ছাড়া অংশ) যেমন অনুসন্ধানের সময় reading a book এটি মেলায় ading

পৃথিবীর মানুষ, কি মনে হয় এগুলো শব্দগুলোর নাম খুব জটিল, খুব কঠিন মনে হয়? আমারও একই অনুভূতি। জানলে চলবে যে এমন একটি বিষয় আছে, এর নাম কী, তাতে কিছু আসে যায় না! মানুষ নামহীন হলে, সে তলোয়ার চালনায় মনোযোগ দিতে পারে; বস্তু নামহীন হলে, সে মনের মতো বেছে নিতে পারে……

অ্যাসারশন ব্যবহার করা হয় একটি সত্য হওয়া উচিত এমন সত্যতা ঘোষণা করতে। নিয়মিত অভিব্যক্তিতে শুধুমাত্র যখন অ্যাসারশন সত্য হয় তখনই মেলানো চলতে থাকে।

যদি আপনি একটি খুব দীর্ঘ সংখ্যায় প্রতি তিনটি সংখ্যার মাঝে একটি কমা যোগ করতে চান (অবশ্যই ডান দিক থেকে শুরু করে), তাহলে আপনি এভাবে খুঁজে পেতে পারেন যে কোথায় কমা যোগ করা দরকার: ((?<=\d)\d{3})+\b এটি ব্যবহার করে 1234567890 অনুসন্ধান করার সময় ফলাফল হলো 234567890

নীচের এই উদাহরণটি এই দুটি দাবি একসঙ্গে ব্যবহার করেছে: (?<=\s)\d+(?=\s) ম্যাচ করা শূন্যস্থান দ্বারা পৃথক করা সংখ্যা (পুনরায় জোর দেওয়া হচ্ছে, এই শূন্যস্থানগুলি অন্তর্ভুক্ত নয়)

নেতিবাচক শূন্য প্রস্থ দাবী

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

\b\w * q [ ^u ] \w * \b ম্যাচ করা সামিল পিছনের অক্ষরটি u নয় বরং q। এর শব্দ কিন্তু যদি আরও পরীক্ষণ করা হয় (অথবা আপনার চিন্তাভাবনা যথেষ্ট তীক্ষ্ণ হয়, সরাসরি এটি লক্ষ্য করেন), আপনি দেখতে পাবেন, যদি 'q' শব্দের শেষের দিকে থাকে, যেমন Iraq , Benq এই প্রকাশনাটি ত্রুটি হবে। এর কারণ হলো [^u] একটি অক্ষর মেলানোর জন্য সর্বদা প্রয়োজন, তাই যদি q শব্দের শেষ অক্ষর হয়, তবে পরে [ ^u] q এর পরে শব্দের বিভাজক (সম্ভবত ফাঁকা, অথবা পূর্ণবিরাম বা অন্য কিছু) মিলবে। \w * \b পরবর্তী শব্দটি মেলানো হবে, তাই \b\w * q [ ^u]\w * \b সম্পূর্ণ মেলানো সম্ভব। Iraq fighting নেতিবাচক শূন্য প্রস্থ দাবী এমন সমস্যা সমাধান করা সম্ভব, কারণ এটি কেবল একটি অবস্থানের সাথে মেলে, এবং এটি না। ব্যয় যেকোনো অক্ষর। এখন, আমরা এই সমস্যাটি এইভাবে সমাধান করতে পারি: \b\w * q(?!u)\w * \b

শূন্য প্রস্থ নেতিবাচক পূর্বাভাস পূর্বশর্ত (?!exp) এই অবস্থানের পিছনে এক্সপ্রেশন exp মিলবে না। যেমন: \d{3}(?!\d) তিনটি সংখ্যার সাথে মেলানো, এবং এটি তিনটি সংখ্যার পর আর সংখ্যা হতে পারবে না। \b((?!abc)\w)+\b ম্যাচ করা অবিরাম স্ট্রিং অন্তর্ভুক্ত নয় abc এর শব্দ

একইভাবে, আমরা ব্যবহার করতে পারি (?<!exp) , জিরো উইডথ নেগেটিভ রিভিউ পরে প্রকাশিত দাবি আসো এই অবস্থানের সামনে অভিব্যক্তি exp মেলানো উচিত নয়। (?<![a-z])\d{7} ম্যাচ করা সামনে ছোট হাতের অক্ষর নয় এমন সাতটি সংখ্যা

একটি আরও জটিল উদাহরণ: (?<=<(\w+)>). * (?=<\/\1>) গুণাবলী অন্তর্ভুক্ত না করা সাধারণ HTML ট্যাগের ভিতরের বিষয়বস্তু মেলানো (?<=<(\w+)>) এমন একটি নির্ধারণ করা হয়েছে পূর্বসূত্র কৌণিক চিহ্ন দ্বারা ঘেরা শব্দ (যেমন হতে পারে < b>),然后是 .* (যেকোনো স্ট্রিং),শেষে একটি পূর্ববর্ধক (?=<\/\1>) দ্রষ্টব্য,suffix-এ। \/ এটি পূর্বে উল্লেখিত অক্ষর পাল্টানো ব্যবহার করেছে; \1 এটি একটি বিপরীত উদ্ধৃতি, যা উদ্ধৃত করছে ঠিক। ধরা পড়া প্রথম গ্রুপ আগের (\w+) মিলিত বিষয়বস্তু, এইভাবে যদি প্রিফিক্স আসলে হয় < b>的话,后缀就是 < /b>了。整个表达式匹配的是 < b>和 < /b>之间的内容(再次提醒,不包括前缀和后缀本身)。

অনুগ্রহ করে প্রকাশটি বিস্তারিত বিশ্লেষণ করুন। (?<=<(\w+)>). * (?=<\/\1>) এই অভিব্যক্তিটি শূন্য প্রস্থের দাবি (zero-width assertion) এর প্রকৃত ব্যবহারের সঠিক প্রতিফলন করে।

মন্তব্য

ছোট বন্ধনী ব্যবহারের আরেকটি উপায় হলো ব্যাকরণ মাধ্যমে। (?#comment) মন্তব্য অন্তর্ভুক্ত করুন। উদাহরণস্বরূপ: 2[0-4]\d(?#200-249)|25 [ 0-5](?#250-255)|[01]?\d\d?(?#0-199)

মন্তব্য অন্তর্ভুক্ত করতে হলে, "অগ্রাহ্য মোডে শূন্যস্থান" বিকল্পটি সক্রিয় করা সবচেয়ে ভালো, যাতে অভিব্যক্তি লেখার সময় যে কোনো জায়গায় শূন্যস্থান, ট্যাব, লাইন বিরতি যোগ করা যায় এবং বাস্তব ব্যবহারে এগুলি অগ্রাহ্য করা হবে। এই বিকল্পটি সক্রিয় করার পর, # এর পরে থেকে এই লাইনের শেষ পর্যন্ত সমস্ত পাঠ্য মন্তব্য হিসেবে অগ্রাহ্য করা হবে। উদাহরণস্বরূপ, আমরা উপরের একটি অভিব্যক্তি এইভাবে লিখতে পারি:

(?<= # মেলানোর জন্য পাঠ্যের পূর্বসূরী নিশ্চিত করুন
<(\w+)> # কোণার কোটের মধ্যে থাকা অক্ষর বা সংখ্যা খুঁজুন (অর্থাৎ HTML/XML ট্যাগ)
) # প্রিফিক্স শেষ
.* # যেকোনো পাঠ্য মিলে যাওয়া
(?= # মিলানোর জন্য পাঠ্যের শেষাংশ নিশ্চিত করা
<\/\1> # 查找尖括号括起来的内容:前面是一个"/",后面是先前捕获的标签
) # উপসর্গ শেষ

লোভ এবং অলসতা

যখন নিয়মিত অভিব্যক্তিতে পুনরাবৃত্তি গ্রহণকারী সীমাবদ্ধতা অন্তর্ভুক্ত থাকে, তখন সাধারণ আচরণ হলো (পুরো অভিব্যক্তিটি মেলানোর শর্তে) মেলানো। যতটা সম্ভব বেশি অক্ষর। এই প্রকাশনাটি উদাহরণ হিসাবে: a. * b এটি মেলাবে। a দিয়ে শুরু হয়ে b দিয়ে শেষ হওয়া সবচেয়ে দীর্ঘ স্ট্রিং যদি এটি ব্যবহার করে অনুসন্ধান করা হয়। aabab এর কথা, এটি পুরো স্ট্রিংটি মেলাবে। aabab এটি বলা হয় লালসা মিলানো।

কখনও কখনও, আমাদের আরও প্রয়োজন। অলস ম্যাচিং, অর্থাৎ ম্যাচিং। যতটা সম্ভব কম এর অক্ষর। আগে দেওয়া সীমাবদ্ধতা সমূহ অলস মেলানোর মোডে রূপান্তরিত করা যায়, কেবল তার পরে একটি প্রশ্ন চিহ্ন যোগ করলেই। ? এভাবে .*? মানে যেকোনো সংখ্যক পুনরাবৃত্তি মেলানো, তবে পুরো মেলানো সফল করার জন্য কমপক্ষে পুনরাবৃত্তি ব্যবহার করতে হবে। এখন অলস সংস্করণের উদাহরণ দেখা যাক:

a. * ?b ম্যাচ করা সবচেয়ে ছোট, 'a' দিয়ে শুরু এবং 'b' দিয়ে শেষ হওয়া স্ট্রিং। যদি এটি প্রয়োগ করা হয় aabab এটা মেলানো হবে। aab (প্রথম থেকে তৃতীয় অক্ষর) এবং চতুর্থ থেকে পঞ্চম অক্ষর

কোড/ব্যাকরণ বিবরণ
*? যতবার প্রয়োজন, কিন্তু যতটা সম্ভব কম পুনরাবৃত্তি করুন।
+? একবার বা তার বেশি পুনরাবৃত্তি করুন, তবে যতটা সম্ভব কম পুনরাবৃত্তি করুন।
?? 0 বা 1 বার পুনরাবৃত্তি করুন, কিন্তু যতটা সম্ভব কম পুনরাবৃত্তি করুন।
{n,m}? n থেকে m বার পুনরাবৃত্তি করুন, তবে যতটা সম্ভব কম পুনরাবৃত্তি করুন।
{n,}? n বার উপরে, কিন্তু যতটা সম্ভব কম পুনরাবৃত্তি।

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

প্রক্রিয়াকরণ বিকল্প

উপরের অংশে কিছু বিকল্প যেমন কেস অগ্রাহ্য করা, একাধিক লাইন পরিচালনা করা ইত্যাদি সম্পর্কে আলোচনা করা হয়েছে, এই বিকল্পগুলি নিয়মিত প্রকাশগুলির প্রক্রিয়া পরিবর্তন করতে ব্যবহার করা যেতে পারে। নিচে .Net-এ সাধারণত ব্যবহৃত নিয়মিত প্রকাশের বিকল্পগুলি দেওয়া হল:

নাম বিবরণ
IgnoreCase (বড় হাতের অক্ষর বা ছোট হাতের অক্ষর উপেক্ষা করুন) মেলানোর সময় বড় বা ছোট হাতের অক্ষর আলাদা করা হয় না।
Multiline (বহু লাইন মোড) পরিবর্তন ^ এবং $ এর অর্থ হল, সেগুলি যেকোনো একটি লাইনের শুরু এবং শেষের সাথে মেলানো হবে, শুধুমাত্র পুরো স্ট্রিংয়ের শুরু এবং শেষের সাথে নয়। (এই প্যাটার্নে, $ এর সঠিক অর্থ হলো: মিলে যাওয়া\nপূর্বের অবস্থান এবং স্ট্রিংয়ের শেষের অবস্থান।)
Singleline (একক লাইন মোড) প্রতিটি অক্ষরের সাথে মিলে যাওয়ার জন্য . এর অর্থ পরিবর্তন করুন (লাইন ব্রেক সহ \n)।
IgnorePatternWhitespace (শূন্যস্থান উপেক্ষা করুন) এক্সপ্রেশনের মধ্যে অ-এস্কেপড ফাঁকা স্থানগুলি উপেক্ষা করুন এবং সক্ষম করুন দ্বারা # মার্ক করা মন্তব্য
ExplicitCapture (স্পষ্ট ক্যাপচার) শুধুমাত্র স্পষ্টভাবে নামকৃত গোষ্ঠী ধারণ করুন

একটি প্রায়ই জিজ্ঞাসা করা প্রশ্ন হল: কি একসাথে শুধুমাত্র মাল্টি-লাইন মোড এবং সিঙ্গল-লাইন মোডের মধ্যে একটি ব্যবহার করা সম্ভব? উত্তর হল: নয়। এই দুটি অপশনের মধ্যে কোনও সম্পর্ক নেই, শুধুমাত্র তাদের নামগুলি কিছুটা অনুরূপ (যার ফলে বিভ্রান্তির সৃষ্টি হয়) ছাড়া।

C# এ, আপনি ব্যবহার করতে পারেন Regex(String, RegexOptions) কনস্ট্রাক্টর 来设置正则表达式的处理选项。如:Regex regex = new Regex(@"\ba\w{6}\b", RegexOptions.IgnoreCase);

সামঞ্জস্যপূর্ণ গোষ্ঠী/পুনরাবৃত্তি মিলানো

কখনও কখনও আমাদের মতো কিছু ম্যাচ করতে হবে ( 100 * ( 50 + 15 ) ) এমন একটি নেস্টেড স্তরবিন্যাসের কাঠামো, তখন সহজেই ব্যবহার করা হয় \ (.+ \ ) তাহলে এটি কেবলমাত্র সবচেয়ে বাম দিকের বাম বন্ধনী এবং সবচেয়ে ডান দিকের ডান বন্ধনীর মধ্যে বিষয়বস্তু মিল করবে (এখানে আমরা লোভী মোড নিয়ে আলোচনা করছি, অলস মোডেও নিচের সমস্যাগুলি রয়েছে)। যদি মূল স্ট্রিংয়ে বাম বন্ধনী এবং ডান বন্ধনীর উপস্থিতির সংখ্যা সমান না হয়, যেমন ( 5 / ( 3 + 2 ) ) ) তাহলে আমাদের মেলানোর ফলাফলে উভয়ের সংখ্যা সমান হবে না। এমন একটি স্ট্রিংয়ে সবচেয়ে দীর্ঘ, জোড়যুক্ত বন্ধনী之间的内容 কীভাবে মেলানো যাবে?

এখানে উপস্থাপিত ভারসাম্য গোষ্ঠী ব্যাকরণটি .Net ফ্রেমওয়ার্ক দ্বারা সমর্থিত; অন্যান্য ভাষা/লাইব্রেরি এই ফাংশনটি সমর্থন নাও করতে পারে, অথবা এই ফাংশনটি সমর্থন করে কিন্তু বিভিন্ন ব্যাকরণ ব্যবহার করতে হতে পারে।

এটি এড়ানোর জন্য ( এবং \ ( তোমার মস্তিষ্ক পুরোপুরি গুলিয়ে দিন, আমরা এখন গোলাকার বন্ধনী বদলে তীক্ষ্ণ বন্ধনী ব্যবহার করি। এখন আমাদের প্রশ্ন হয়ে গেছে কিভাবে xx aa> yy এই ধরনের স্ট্রিংয়ে, সবচেয়ে দীর্ঘ পেয়ার করা তীক্ষ্ণ কোণের মধ্যে বিষয়বস্তুটি ক্যাপচার করুন?

এখানে নিচের গ্রামার গঠনগুলোর প্রয়োজন:

  • (?'group') আঁকড়ে ধরা বিষয়বস্তুকে গ্রুপ নামে নামকরণ করুন এবং এটি চাপুন। স্ট্যাক (Stack)

  • (?'-group') স্ট্যাক থেকে শেষ প্রবেশ করা group নামের ক্যাপচার কনটেন্টটি বের করুন, যদি স্ট্যাকটি মূলত খালি থাকে, তবে এই গ্রুপের মেলানো ব্যর্থ হবে।

  • (?(group)yes|no) যদি স্ট্যাকের উপর "group" নামে একটি ক্যাপচার করা বিষয়বস্তু থাকে, তাহলে "yes" অংশের এক্সপ্রেশন মেলানোর কাজ চালিয়ে যান, অন্যথায় "no" অংশের সাথে মেলানোর কাজ চালিয়ে যান।

  • (?!) জিরো-ওয়াইড নেগেটিভ লুকএহেড, যেহেতু কোন সাফিক্স এক্সপ্রেশন নেই, মিলানোর চেষ্টা সবসময় ব্যর্থ হয়।

    我们需要做的是每碰到了左括号,就在压入一个"Open",每碰到一个右括号,就弹出一个,到了最后就看看堆栈是否为空--如果不为空那就证明左括号比右括号多,那匹配就应该失败。正则表达式引擎会进行回溯(放弃最前面或最后面的一些字符),尽量使整个表达式得到匹配。

如果你不是一个程序员(或者你自称程序员但是不知道堆栈是什么东西),你就这样理解上面的三种语法吧:第一个就是在黑板上写一个"group",第二个就是从黑板上擦掉一个"group",第三个就是看黑板上写的还有没有"group",如果有就继续匹配yes部分,否则就匹配no部分。

সমতা গোষ্ঠীর একটি সবচেয়ে সাধারণ ব্যবহার হল HTML মেলানো, নিচের এই উদাহরণটি নেস্টেড মেলানোর জন্য ব্যবহার করা যেতে পারে। < div>标签: <div [ ^>] * > [ ^<>]*(((?'Open'] * >) [ ^<>] * )+((?'-Open') [ ^<>] * )+) * (?(Open)(?!)) < /div>

আরো কী কী জিনিস উল্লেখ করা হয়নি?

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

কোড/ব্যাকরণ বিবরণ
\a অ্যালার্ম অক্ষর (এটি প্রিন্ট করলে কম্পিউটার একটি টুইট শব্দ করে)
\b সাধারণত শব্দ বিভাজন স্থানে, কিন্তু যদি অক্ষর শ্রেণীতে ব্যবহার করা হয় তবে এটি ব্যাকস্পেস প্রতিনিধিত্ব করে।
\t ট্যাব
\r এন্টার
\v উলম্ব রেখা টেবিল চিহ্ন
\f পাতা পরিবর্তন চিহ্ন
\n লাইন পরিবর্তন চিহ্ন
\e Escape
\0nn ASCII কোডে অক্টাল কোড nn-এর চরিত্র
\xnn ASCII কোডে ষোলমিক কোড nn এর চরিত্র
\unnnn ইউনিকোড কোডে ষোলোজন সংখ্যা কোড nnnn এর চরিত্র
\cN ASCII নিয়ন্ত্রণ অক্ষর। যেমন \cC মানে Ctrl+C।
\A স্ট্রিংয়ের শুরু (মত ^, কিন্তু মাল্টি-লাইন বিকল্পের প্রভাবের অধীনে নয়)
\Z স্ট্রিংয়ের শেষ অথবা লাইনের শেষ (মাল্টিলাইন অপশন প্রভাবিত নয়)
\z স্ট্রিংয়ের শেষ (যেমন $ , কিন্তু একাধিক লাইন বিকল্পগুলির প্রভাবের বাইরে)
\G বর্তমান অনুসন্ধানের শুরু
\p{name} ইউনিকোডে নামকরণ করা চরিত্র শ্রেণী যেমন \p{IsGreek}
(?>exp) লোভী সাব এক্সপ্রেশন
(? < x> - < y>exp) সামঞ্জস্য গোষ্ঠী
(?im-nsx:exp) উপ-expressions exp এ প্রক্রিয়াকরণের বিকল্পগুলি পরিবর্তন করুন
(?im-nsx) ব্যক্তিগত অংশের পরে প্রক্রিয়া বিকল্প পরিবর্তন করুন।
(?(exp)yes|no) exp-কে শূন্য প্রস্থের ইতিবাচক পূর্বাভাস হিসাবে বিবেচনা করুন, যদি এই অবস্থানে মেলানো যায়, তবে এই গ্রুপের প্রকাশনার জন্য yes ব্যবহার করুন; অন্যথায় no ব্যবহার করুন।
(?(exp)yes) একই, শুধু খালি অভিব্যক্তি ব্যবহার করে না।
(?(name)yes|no) যদি নামকৃত গ্রুপটি কন্টেন্ট ধারণ করে, তাহলে yes ব্যবহার করুন; অন্যথায় no ব্যবহার করুন।
(?(name)yes) একই, শুধু খালি অভিব্যক্তি ব্যবহার করে না।

লেখকের সাথে যোগাযোগ করুন

好吧,我承认,我骗了你,读到这里你肯定花了不止30分钟.相信我,这是我的错,而不是因为你太笨.我之所以说"30分钟",是为了让你有信心,有耐心继续下去.既然你看到了这里,那证明我的阴谋成功了.被忽悠的感觉很爽吧?

আপনি যদি আমাকে অভিযোগ করতে চান, অথবা মনে করেন যে আমি আরও দক্ষভাবে প্রতারণা করতে পারি, অথবা অন্য কোনও সমস্যা থাকলে, স্বাগতম। আমার ব্লগ আমাকে জানাও।

অনলাইনে উপলব্ধ সম্পদ এবং এই নিবন্ধের রেফারেন্সগুলি

আপনি সাম্প্রতিককালে ব্যবহার করেছেন:

সংগ্রহ মেনু QQ