আসন্ন নিয়মিত অভিব্যক্তি বৈশিষ্ট্য

ES2015 জাভাস্ক্রিপ্ট ভাষায় অনেক নতুন বৈশিষ্ট্য প্রবর্তন করেছে, যার মধ্যে ইউনিকোড ( /u ) এবং স্টিকি ( /y ) পতাকাগুলির সাথে নিয়মিত এক্সপ্রেশন সিনট্যাক্সে উল্লেখযোগ্য উন্নতি রয়েছে। কিন্তু এরপর থেকে উন্নয়ন থেমে নেই। TC39 (ECMAScript স্ট্যান্ডার্ড বডি) এর অন্যান্য সদস্যদের সাথে শক্ত সহযোগিতায়, V8 টিম রেগুলার এক্সপ্রেশনগুলিকে আরও শক্তিশালী করার জন্য বেশ কয়েকটি নতুন বৈশিষ্ট্য প্রস্তাব করেছে এবং সহ-ডিজাইন করেছে।

এই বৈশিষ্ট্যগুলি বর্তমানে জাভাস্ক্রিপ্ট স্পেসিফিকেশনে অন্তর্ভুক্ত করার জন্য প্রস্তাব করা হচ্ছে। যদিও প্রস্তাবগুলি সম্পূর্ণরূপে গৃহীত হয়নি, তারা ইতিমধ্যেই TC39 প্রক্রিয়ার 3 পর্যায়ে রয়েছে৷ স্পেসিফিকেশন চূড়ান্ত হওয়ার আগে সংশ্লিষ্ট প্রস্তাব লেখকদের সময়মত নকশা এবং বাস্তবায়ন প্রতিক্রিয়া প্রদান করতে সক্ষম হওয়ার জন্য আমরা একটি পতাকার পিছনে (নীচে দেখুন) এই বৈশিষ্ট্যগুলি প্রয়োগ করেছি।

এই ব্লগ পোস্ট আপনাকে এই উত্তেজনাপূর্ণ ভবিষ্যতের একটি পূর্বরূপ দেয়। আপনি যদি আসন্ন উদাহরণগুলি অনুসরণ করতে চান, chrome://flags/#enable-javascript-harmony এ পরীক্ষামূলক JavaScript বৈশিষ্ট্যগুলি সক্ষম করুন৷

নামধারী ক্যাপচার

রেগুলার এক্সপ্রেশনে তথাকথিত ক্যাপচার (বা গ্রুপ) থাকতে পারে, যা মিলিত টেক্সটের একটি অংশ ক্যাপচার করতে পারে। এখন পর্যন্ত, বিকাশকারীরা শুধুমাত্র তাদের সূচক দ্বারা এই ক্যাপচারগুলি উল্লেখ করতে পারে, যা প্যাটার্নের মধ্যে ক্যাপচারের অবস্থান দ্বারা নির্ধারিত হয়।

const pattern = /(\d{4})-(\d{2})-(\d{2})/u;
const result = pattern.exec('2017-07-10');
// result[0] === '2017-07-10'
// result[1] === '2017'
// result[2] === '07'
// result[3] === '10'

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

/(?:(.)(.(?<=[^(])(.)))/  // Index of the last capture?

এবং আরও খারাপ, একটি প্যাটার্নে পরিবর্তনগুলি সম্ভাব্য সমস্ত বিদ্যমান ক্যাপচারের সূচকগুলিকে পরিবর্তন করতে পারে:

/(a)(b)(c)\3\2\1/     // A few simple numbered backreferences.
/(.)(a)(b)(c)\4\3\2/  // All need to be updated.

নামযুক্ত ক্যাপচারগুলি একটি আসন্ন বৈশিষ্ট্য যা বিকাশকারীদের ক্যাপচারের জন্য নাম বরাদ্দ করার অনুমতি দিয়ে এই সমস্যাগুলি হ্রাস করতে সহায়তা করে। সিনট্যাক্স পার্ল, জাভা, .নেট এবং রুবির মতো:

const pattern = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u;
const result = pattern.exec('2017-07-10');
// result.groups.year === '2017'
// result.groups.month === '07'
// result.groups.day === '10'

নামযুক্ত ক্যাপচারগুলি নামযুক্ত ব্যাকরেফারেন্স এবং String.prototype.replace এর মাধ্যমেও উল্লেখ করা যেতে পারে:

// Named backreferences.
/(?<LowerCaseX>x)y\k<LowerCaseX>/.test('xyx');  // true

// String replacement.
const pattern = /(?<fst>a)(?<snd>b)/;
'ab'.replace(pattern, '$<snd>$<fst>');                              // 'ba'
'ab'.replace(pattern, (m, p1, p2, o, s, {fst, snd}) => fst + snd);  // 'ba'

এই নতুন বৈশিষ্ট্যটির সম্পূর্ণ বিবরণ স্পেসিফিকেশন প্রস্তাবে পাওয়া যায়।

ডটঅল পতাকা

ডিফল্টরূপে, . রেগুলার এক্সপ্রেশনে পরমাণু লাইন টার্মিনেটর ছাড়া যেকোনো অক্ষরের সাথে মেলে:

/foo.bar/u.test('foo\nbar');   // false

একটি প্রস্তাব dotAll মোড প্রবর্তন করে, /s পতাকার মাধ্যমে সক্রিয় করা হয়েছে। ডটঅল মোডে, . লাইন টার্মিনেটরও মেলে।

/foo.bar/su.test('foo\nbar');  // true

এই নতুন বৈশিষ্ট্যটির সম্পূর্ণ বিবরণ স্পেসিফিকেশন প্রস্তাবে পাওয়া যায়।

ইউনিকোড সম্পত্তি অব্যাহতি

ES2015 এ ইউনিকোড সচেতনতা চালু হওয়ার সাথে সাথে, হঠাৎ করে আরও অনেক অক্ষর আছে যেগুলোকে সংখ্যা হিসেবে বিবেচনা করা যেতে পারে, উদাহরণস্বরূপ বৃত্তাকার সংখ্যা এক: ①; বা বিবেচিত শব্দ অক্ষর, উদাহরণস্বরূপ তুষার জন্য চীনা অক্ষর: 雪।

এগুলোর কোনোটিই \d বা \w এর সাথে মিলানো যাবে না। এই শর্টহ্যান্ডের অর্থ পরিবর্তন করলে বিদ্যমান রেগুলার এক্সপ্রেশন প্যাটার্ন ভেঙ্গে যাবে।

পরিবর্তে, নতুন সম্পত্তি পালানোর ক্রম চালু করা হচ্ছে। মনে রাখবেন যে তারা শুধুমাত্র /u পতাকা দ্বারা চিহ্নিত ইউনিকোড-সচেতন রেগুলার এক্সপ্রেশনের জন্য উপলব্ধ।

/\p{Number}/u.test('①');      // true
/\p{Alphabetic}/u.test('雪');  // true

বিপরীতটি \P এর সাথে মিলিত হতে পারে।

/\P{Number}/u.test('①');      // false
/\P{Alphabetic}/u.test('雪');  // false

ইউনিকোড কনসোর্টিয়াম আরও অনেক বৈশিষ্ট্য সংজ্ঞায়িত করে, উদাহরণস্বরূপ গণিত প্রতীক বা জাপানি হিরাগানা অক্ষরের জন্য:

/^\p{Math}+$/u.test('∛∞∉');                            // true
/^\p{Script_Extensions=Hiragana}+$/u.test('ひらがな');  // true

সমর্থিত ইউনিকোড প্রপার্টি ক্লাসের সম্পূর্ণ তালিকা বর্তমান স্পেসিফিকেশন প্রস্তাবে পাওয়া যাবে। আরও উদাহরণের জন্য, এই তথ্যপূর্ণ নিবন্ধটি দেখুন।

দাবীর পিছনে তাকান

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

নামটি ইতিমধ্যে এর অর্থ বেশ ভালভাবে বর্ণনা করেছে। এটি একটি প্যাটার্নকে শুধুমাত্র মেলে সীমাবদ্ধ করার একটি উপায় অফার করে যদি লুক বিহাইন্ড গ্রুপে প্যাটার্নের আগে থাকে। এটি মিলিত এবং অ-ম্যাচিং উভয় স্বাদেই আসে:

/(?<=\$)\d+/.exec('$1 is worth about ¥123');  // ['1']
/(?<!\$)\d+/.exec('$1 is worth about ¥123');  // ['123']

আরও বিশদ বিবরণের জন্য, আমাদের পূর্ববর্তী ব্লগ পোস্টটি দেখুন যা পিছনের দাবিগুলির জন্য নিবেদিত, এবং সম্পর্কিত V8 পরীক্ষার ক্ষেত্রে উদাহরণগুলি।

স্বীকৃতি

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

আমরা আশা করি আপনি এই নতুন রেগুলার এক্সপ্রেশন বৈশিষ্ট্যগুলি সম্পর্কে আমাদের মতোই উত্তেজিত!