ویژگی های بیان منظم آینده

ES2015 بسیاری از ویژگی‌های جدید را به زبان جاوا اسکریپت معرفی کرد، از جمله پیشرفت‌های قابل توجهی در نحو عبارت منظم با پرچم‌های یونیکد ( /u ) و چسبنده ( /y ). اما توسعه از آن زمان متوقف نشده است. تیم V8 با همکاری نزدیک با سایر اعضا در TC39 (سازمان استانداردهای ECMAScript)، چندین ویژگی جدید را برای قدرتمندتر کردن عبارات منظم پیشنهاد و طراحی کرده است.

این ویژگی ها در حال حاضر برای گنجاندن در مشخصات جاوا اسکریپت پیشنهاد می شوند. حتی اگر پیشنهادها به طور کامل پذیرفته نشده اند، آنها در حال حاضر در مرحله 3 در فرآیند TC39 هستند. ما این ویژگی‌ها را در پشت یک پرچم (نگاه کنید به زیر) پیاده‌سازی کرده‌ایم تا بتوانیم بازخورد طراحی و پیاده‌سازی به موقع را قبل از نهایی شدن مشخصات به نویسندگان پیشنهاد مربوطه ارائه دهیم.

این پست وبلاگ پیش نمایشی از این آینده هیجان انگیز را به شما ارائه می دهد. اگر می‌خواهید نمونه‌های بعدی را دنبال کنید، ویژگی‌های آزمایشی جاوا اسکریپت را در chrome://flags/#enable-javascript-harmony فعال کنید.

به نام ضبط

عبارات منظم می توانند حاوی به اصطلاح عکس ها (یا گروه ها) باشند که می توانند بخشی از متن تطبیق داده شده را بگیرند. تا کنون، توسعه‌دهندگان تنها می‌توانستند به این عکس‌ها با شاخص خود اشاره کنند، که با موقعیت عکس‌برداری در الگو تعیین می‌شود.

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'

جزئیات کامل این ویژگی جدید در پیشنهاد مشخصات موجود است.

پرچم dotAll

به طور پیش فرض، . اتم در عبارات منظم با هر کاراکتری به جز پایان دهنده های خط مطابقت دارد:

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

یک پیشنهاد حالت dotAll را معرفی می کند که از طریق پرچم /s فعال می شود. در حالت dotAll، . با پایان دهنده های خط نیز مطابقت دارد.

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

جزئیات کامل این ویژگی جدید در پیشنهاد مشخصات موجود است.

ویژگی یونیکد فرار می کند

با آگاهی از یونیکد که در ES2015 معرفی شد، ناگهان کاراکترهای بسیار بیشتری وجود دارند که می توانند اعداد در نظر گرفته شوند، برای مثال رقم دایره شده یک: ①; یا کاراکترهای کلمه در نظر گرفته می شود، برای مثال کاراکتر چینی برای برف: 雪.

هیچ یک از اینها را نمی توان با \d یا \w مطابقت داد. تغییر معنای این کوتاه‌نویسی‌ها، الگوهای بیان منظم موجود را از بین می‌برد.

در عوض، توالی‌های فرار از ویژگی جدید معرفی می‌شوند. توجه داشته باشید که آنها فقط برای عبارات منظم Unicode-aware که با پرچم /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

فهرست کامل کلاس‌های دارایی Unicode پشتیبانی شده را می‌توانید در پیشنهاد مشخصات فعلی پیدا کنید. برای مثال های بیشتر، نگاهی به این مقاله آموزنده بیندازید.

نگاهی به اظهارات

اظهارات Lookahead از ابتدا بخشی از نحو عبارت منظم جاوا اسکریپت بوده است. همتای آنها، در پشت ادعاها، در نهایت معرفی شدند. برخی از شما ممکن است به یاد داشته باشید که این بخشی از V8 برای مدتی طولانی است. ما حتی برای پیاده سازی پرچم یونیکد مشخص شده در ES2015 از عبارات lookbehind در زیر هود استفاده می کنیم.

این نام قبلاً معنای آن را به خوبی توصیف می کند. این روشی را برای محدود کردن یک الگوی ارائه می‌دهد تا فقط در صورتی که الگوی آن در گروه lookbehind وجود داشته باشد مطابقت داشته باشد. این در هر دو طعم منطبق و غیر همسان وجود دارد:

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

برای جزئیات بیشتر، پست وبلاگ قبلی ما را که به ادعاهای پشت سر هم اختصاص داده شده است، و نمونه هایی در موارد تست V8 مربوط را بررسی کنید.

قدردانی ها

این پست وبلاگ بدون ذکر برخی از افرادی که سخت تلاش کرده اند کامل نمی شود: به ویژه قهرمانان زبان Mathias Bynens ، Dan Ehrenberg ، Claude Pache ، Brian Terlson ، Thomas Wood ، Gorkem Yakin، و گورو Irregexp Erik Corry . بلکه هر کس دیگری که در مشخصات زبان و اجرای این ویژگی ها توسط V8 کمک کرده است.

ما امیدواریم که شما نیز مانند ما در مورد این ویژگی های جدید بیان منظم هیجان زده باشید!