Fitur regular expression mendatang

ES2015 memperkenalkan banyak fitur baru pada bahasa JavaScript, termasuk peningkatan signifikan pada sintaks ekspresi reguler dengan (/u) dan flag melekat (/y). Namun, pengembangan belum berhenti sejak saat itu. Di beberapa kolaborasi ketat dengan anggota lain di TC39 (badan standar ECMAScript), tim V8 telah mengusulkan dan bersama-sama merancang beberapa fitur baru untuk membuat ekspresi yang lebih ampuh.

Fitur ini sedang diusulkan untuk disertakan dalam JavaScript spesifikasi pendukung. Meskipun proposal belum sepenuhnya disetujui, proposal tersebut sudah berada di Tahap 3 dalam proses TC39. Kami telah menerapkan fitur di balik penanda (lihat di bawah) untuk dapat memberikan desain yang tepat waktu dan masukan implementasi kepada masing-masing penulis proposal sebelum spesifikasi sudah selesai.

Posting blog ini memberi Anda pratinjau tentang masa depan yang menarik ini. Jika Anda ingin ikuti contoh berikutnya, aktifkan JavaScript eksperimental di chrome://flags/#enable-javascript-harmony.

Tangkapan bernama

Ekspresi reguler dapat berisi apa yang disebut tangkapan (atau grup), yang dapat menangkap sebagian teks yang cocok. Sejauh ini, developer hanya bisa merujuk ke tangkapan layar ini berdasarkan indeksnya, yang ditentukan oleh posisi tangkap dalam pola.

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'

Tetapi ekspresi reguler sudah sangat sulit dibaca, ditulis, dan dipelihara, dan referensi numerik bisa menambahkan detail lebih lanjut. Contohnya, dalam pola yang lebih panjang, bisa jadi sulit untuk menentukan indeks objek tertentu rekam:

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

Dan lebih buruk lagi, perubahan pada sebuah pola potensial mengubah indeks semua screenshot yang ada:

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

Tangkapan bernama adalah fitur mendatang yang membantu memitigasi masalah ini dengan memungkinkan pengembang untuk menetapkan nama untuk tangkapan. {i>Syntax<i}-nya mirip dengan Perl, Java, .Net, dan Ruby:

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'

Tangkapan bernama juga bisa dirujuk oleh referensi belakang bernama dan melalui 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'

Detail lengkap fitur baru ini tersedia di proposal spesifikasi.

flag dotAll

Secara default, atom . dalam ekspresi reguler cocok dengan karakter apa pun kecuali untuk penutup baris:

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

Proposal memperkenalkan mode dotAll, yang diaktifkan melalui tanda /s. Di dotAll mode, . juga cocok dengan penutup baris.

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

Detail lengkap fitur baru ini tersedia di proposal spesifikasi.

Escape properti Unicode

Dengan kesadaran Unicode yang diperkenalkan di ES2015, tiba-tiba ada lebih banyak lagi karakter yang dapat dianggap sebagai angka, misalnya angka satu yang dilingkari: ①; atau dianggap sebagai karakter kata, misalnya karakter bahasa China untuk salju: 雪.

Tidak satu pun dari keduanya dapat dicocokkan dengan \d atau \w. Mengubah makna jalan pintas ini akan merusak pola ekspresi reguler yang ada.

Sebagai gantinya, urutan escape properti baru diperkenalkan. Perhatikan bahwa mereka hanya tersedia untuk ekspresi reguler berbasis Unicode yang dilambangkan oleh flag /u.

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

Kebalikannya dapat dicocokkan dengan \P.

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

Konsorsium Unicode menentukan banyak properti lainnya, misalnya untuk simbol matematika atau karakter Hiragana Jepang:

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

Daftar lengkap kelas properti Unicode yang didukung dapat ditemukan di {i>output<i} proposal spesifikasi. Untuk contoh lainnya, lihat artikel informatif ini.

Pernyataan lihat di belakang

Pernyataan Lookahead telah menjadi bagian dari sintaksis ekspresi reguler JavaScript dari awal. Pasangan mereka, {i>melihat belakang pernyataan<i}, akhirnya diperkenalkan. Sebagian dari Anda mungkin ingat bahwa ini telah menjadi bagian dari V8 cukup lama. Kita bahkan gunakan pernyataan Lookbehind di balik layar untuk mengimplementasikan tanda Unicode yang ditentukan di ES2015.

Nama ini sudah mendeskripsikan artinya dengan cukup baik. Hal ini menawarkan cara untuk membatasi pola yang hanya cocok jika diawali dengan pola dalam kelompok tampilan belakang. Ini tersedia dalam rasa yang cocok dan tidak cocok:

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

Untuk detail selengkapnya, lihat postingan blog kami sebelumnya khusus untuk pernyataan Lookbehind, dan contoh dalam kasus pengujian V8 terkait.

Ucapan terima kasih

Posting blog ini tidak akan lengkap tanpa menyebutkan beberapa orang yang telah bekerja keras untuk mewujudkan hal ini: terutama juara bahasa Mathias Bynens, Dan Ehrenberg, Claude Pache, Brian Terlson, Thomas Wood, Gorkem Yakin, dan guru Irregexp Erik Corry; tetapi juga orang lain yang memiliki berkontribusi pada spesifikasi bahasa dan penerapan V8 baru.

Kami harap Anda bersemangat dengan fitur ekspresi reguler baru ini seperti yang kami tersebut!