- PVSM.RU - https://www.pvsm.ru -
Регулярные выражения в 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):
Начало вывода скрипта Google Chrome Canary 52.0.2710.0 (V8 5.2.26 — текущая стадия реализации, обратите внимание на разницу обработки p{LC}):
Как мы можем видеть из списка реализованного [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/
Нажмите здесь для печати.