- PVSM.RU - https://www.pvsm.ru -

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

Регулярные выражения в JavaScript понемногу догоняют PCRE.

Недавно упомянутая [1] возможность lookbehind перешла на стадию флага --es_staging [2].

Разработчики V8 также начали добавлять в регулярные выражения свойства Юникода [3] (см. общее описание [4] и спецификацию [5] этой характеристики символов).

В продвижении 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 [6]):

node --harmony_regexp_property test.js

В Google Chrome v50 и Node.js v6.0 текущая версия V8 ('5.0.71.32') содержит только первую порцию реализации — самый первый коммит [7] от Feb 10, 2016. Но это уже огромный рывок вперёд, он позволяет работать с т.н. общими категориями символов (описание [8] и спецификация [9]). Наполнение категорий символами можно посмотреть здесь [10].

Пример скрипта [11] для тестирования возможности.

В начале создаётся объект, ключами в котором служат названия категорий, а значениями — по три символа из данной категории. Если категория сборная (то есть просто объединяет в себе несколько других категорий), значением будет функция, объединяющая строки соответствующих категорий. То, что хоть как-то поддаётся внятному отображению, я вводил самими символами; то, что невидимо или сливается (управляющие символы, диакритики и т.д.), вводил при помощи 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):

Unicode character properties в регулярных выражениях V8 - 1

Начало вывода скрипта Google Chrome Canary 52.0.2710.0 (V8 5.2.26 — текущая стадия реализации, обратите внимание на разницу обработки p{LC}):

Unicode character properties в регулярных выражениях V8 - 2

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

Приятного тестирования и успешного осторожного использования.

Автор: vmb

Источник [12]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/javascript/118200

Ссылки в тексте:

[1] Недавно упомянутая: https://habrahabr.ru/post/281270/

[2] перешла на стадию флага --es_staging: https://bugs.chromium.org/p/v8/issues/detail?id=4545#c18

[3] начали добавлять в регулярные выражения свойства Юникода: https://bugs.chromium.org/p/v8/issues/detail?id=4743

[4] общее описание: https://en.wikipedia.org/wiki/Unicode_character_property

[5] спецификацию: http://www.unicode.org/reports/tr44/

[6] уже есть первые RC: https://nodejs.org/download/rc/

[7] самый первый коммит: https://bugs.chromium.org/p/v8/issues/detail?id=4743#c2

[8] описание: https://en.wikipedia.org/wiki/Unicode_character_property#General_Category

[9] спецификация: http://www.unicode.org/reports/tr44/#General_Category_Values

[10] здесь: http://www.fileformat.info/info/unicode/category/index.htm

[11] Пример скрипта: https://gist.github.com/vsemozhetbyt/39aa3baad20a9f4031fc17bd75f1052b

[12] Источник: https://habrahabr.ru/post/281755/