Unicode character properties в регулярних виразах V8

Регулярні вирази в JavaScript потроху наздоганяють PCRE.

Нещодавно згадана можливість lookbehind перейшла на стадію прапора --es_staging.

Розробники V8 почали додавати в регулярні вирази властивості Unicode (див. загальна інформація і специфікацію цієї характеристики символів).

У просуванні lookbehind і character properties, на мій погляд, є дві різниці: перша можливість вводить зовсім небагато нового синтаксису в порівнянні з другою, зате друга менша змінює поведінку всього процесу (порівняйте кількість порушених змінами файлів в исходниках V8 з двома згаданими посиланнями). По суті, властивості Юнікоду — всього лише зручні скорочення, синоніми для різних груп codepoint-ів, тому від них можна чекати мінімум каверз при інтеграції в систему.

Звичайно, обидві можливості не радять застосовувати в продукції (крім Google Chrome, вони ніде в браузерах не реалізовані, а Node.js тільки-но переходить на відповідну їм версію V8, в якій вони все одно поки під прапорами).

Але для особистих потреб (утиліти по обробці тексту і т. д.), мені здається, вони цілком застосовні. Можливо, коду розробників V8, навіть експериментального, часом можна довіряти з нітрохи не більшим ризиком, ніж різноманітним бібліотек на npmjs або GitHub.

У Google Chrome, навіть у стабільній на поточний момент v50, тестування можна проводити під прапором:

chrome.exe --js-flags="--harmony_regexp_property"


В Node.js така можливість з'являється з v6.0вже є перші RC):

node --harmony_regexp_property test.js


У Google Chrome і v50 Node.js v6.0 поточна версія V8 ('5.0.71.32') містить лише першу порцію реалізації — найперший комміт від Feb 10, 2016. Але це вже величезний ривок вперед, він дозволяє працювати з т. зв. загальними категоріями символів (опис і специфікація). Наповнення категорій символами можна подивитися тут.

Приклад скрипта для тестування можливості.

Спочатку створюється об'єкт, ключами в якому служать назви категорій, а значеннями — по три символи з даної категорії. Якщо категорія збірна (тобто просто поєднує в собі кілька інших категорій), значенням буде функція, яка об'єднує рядка відповідних категорій. Те, що хоч якось піддається виразного відображення, я вводив самими символами; те, що невидимо або зливається (керуючі символи, диакритики і т. д.), вводив за допомогою escape-послідовностей.

Потім скрипт перебирає елементи об'єкта, створює ключа (назви категорії) регулярний вираз і тестує з його допомогою значення (рядок з прикладами). Результат виводиться на консоль. Якщо категорія не реалізована, виводиться повідомлення про помилку (в згаданих версіях Google Chrome і v50 Node.js v6.0 не реалізована лише одна збірна, категорія — \p{LC}, але її легко реалізувати вручну за допомогою об'єднання її членів у регулярному виразі; в більш пізніх версіях V8 це упущення вже виправлено). Якщо пошук безуспішний, виводиться null (в скрипті таке відбувається тільки з категорією \p{Cn}, тому що за нею в принципі не закріплений ні один символ і привести приклади для зіставлення неможливо).

Початок виведення скрипта в Node.js 6.0.0-rc.2 (V8 5.0.71.32 — початкова стадія реалізації Unicode character properties):



Початок виведення скрипта Google Chrome Canary 52.0.2710.0 (V8 5.2.26 — поточна стадія реалізації, зверніть увагу на різницю обробки \p{LC}):



Як ми можемо бачити з списку реалізованого, Google Chrome Canary можна вже тестувати значно більший набір можливостей: scripts, loose matching property for names, \p{} in character classes binary and enumerated properties. Скоро ці елементи доберуться і до Node.

Приємного тестування і успішного обережного використання.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.