আমরা ক্যাপচারিং গ্রুপের pattern:(...)
কন্টেন্ট কে রেজাল্ট বা রিপ্লেসমেন্ট ছাড়াও প্যাটার্নের কন্টেন্ট হিসেবে ব্যবহার করতে পারি।
আমরা গ্রুপকে রেফারেন্স হিসেবে প্যাটার্নে 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!"