Skip to content

Files

Latest commit

6c085a5 · Apr 27, 2021

History

History
74 lines (44 loc) · 5.45 KB

File metadata and controls

74 lines (44 loc) · 5.45 KB

প্যাটার্নে ব্যাকরেফারেন্স: \N এবং \k

আমরা ক্যাপচারিং গ্রুপের pattern:(...) কন্টেন্ট কে রেজাল্ট বা রিপ্লেসমেন্ট ছাড়াও প্যাটার্নের কন্টেন্ট হিসেবে ব্যবহার করতে পারি।

নাম্বারের ব্যাকরেফারেন্স: \N

আমরা গ্রুপকে রেফারেন্স হিসেবে প্যাটার্নে pattern:\N ব্যবহার করতে পারি, এখানে N হল গ্রুপ নাম্বার।

এর ব্যবহার আরো ভালোভাবে বুঝতে, চলুন একটা সমস্যা দেখি।

আমাদের একটি উক্তি খুঁজতে হবে: উক্তি হতে পারে একক উদ্ধৃতি চিহ্নের মাধ্যমে subject:'...' বা যুগল উদ্ধৃতি চিহ্নের মাধ্যমে subject:"..." -- শুরু এবং শেষ উভয় চিহ্নই মিলতে হবে।

কিভাবে আমরা এদের খুঁজব?

আমরা উভয়ই চিহ্নই ব্রাকেটে রাখতে পারি: pattern:['"](.*?)['"], তবে এটি মিশ্র চিহ্নদ্বারা গঠিত স্ট্রিংগুলোও খুঁজে পাবে, যেমন match:"...' বা match:'...". কিছু স্ট্রিংয়ের জন্য এটি ভুল ফলাফল দেখাতে পারে, যেমন, subject:"She's the one!":

let str = `He said: "She's the one!".`;

let regexp = /['"](.*?)['"]/g;

// এটি একটি ভুল মিল
alert( str.match(regexp) ); // "She'

এখানে আমরা দেখছি, প্যাটার্নের শুরুর চিহ্নটি match:", এরপর টেক্সটের মাঝে আরো একটি চিহ্ন match:' আছে, এবং অনুসন্ধানটি শেষ হয়।

এজন্য আমাদের নিশ্চিত হতে হবে শেষ উক্তি চিহ্নটি অবশ্যই শুরুর চিহ্নের অনুরূপ, এজন্য আমরা শুরুর অংশটিকে গ্রুপ করে এর ব্যাকরেফারেন্স করতে পারি: pattern:(['"])(.*?)\1

সুতরাং প্যাটার্নটি হবে:

let str = `He said: "She's the one!".`;

*!*
let regexp = /(['"])(.*?)\1/g;
*/!*

alert( str.match(regexp) ); // "She's the one!"

এখন এটি কাজ করছে! রেগুলার এক্সপ্রেশন প্রথম চিহ্নটি খুঁজে pattern:(['"]) এবং কন্টেন্ট হিসেবে সংরক্ষণ করবে। যা প্রথম ক্যাপচারিং গ্রুপ।

এই প্যাটার্ন pattern:\1 দ্বারা বুঝায় "প্রথম গ্রুপের অনুরূপ অনুসন্ধান", এখানে আমাদের ক্ষেত্রে একই উদ্ধৃতি চিহ্ন।

অনুরূপভাবে, pattern:\2 দ্বারা বুঝায় দ্বিতীয় গ্রুপ, pattern:\3 - তৃতীয় গ্রুপ, এভাবেই হতে থাকে।

যদি আমরা গ্রুপে এটি `?:` ব্যবহার করি, তাহলে আমরা গ্রুপকে রেফারেন্স করতে পারব না। যেসব গ্রুপকে ক্যাপচারিং `(?:...)` হতে বাদ দেয়া হয় তাদেরকে ইঞ্জিন সংরক্ষণ করে না।

```warn header="প্যাটার্নকে pattern:\1, রিপ্লেসমেন্টের প্যাটার্নের: `pattern:$1` সাথে গুলিয়ে না ফেলা" রিপ্লেসমেন্টের সময় আমরা ডলার চিহ্ন ব্যবহার করি: `pattern:$1`, আর ব্যাকরেফারেন্সের জন্য ব্যাকস্ল্যাশ `pattern:\1`।


## নামের ব্যাকরেফারেন্স: `\k<name>`

রেগুলার এক্সপ্রেশনে যদি একাধিক প্যারেন্টেসিস থাকে, তাহলে এদের নামকরণ করা সুবিধাজনক।


নেমড গ্রুপগুলোকে ব্যাকরেফারেন্স হিসেবে ব্যবহারের প্যাটার্ন `pattern:\k<name>`।


যেমন নিচের উদাহরণে উদ্ধৃতি চিহ্নকে `pattern:?<quote>` দ্বারা নামকরণ করা হল, সুতরাং ব্যাকরেফারেন্স হবে `pattern:\k<quote>`:

```js run
let str = `He said: "She's the one!".`;

*!*
let regexp = /(?<quote>['"])(.*?)\k<quote>/g;
*/!*

alert( str.match(regexp) ); // "She's the one!"