Lookbehind assertions в регулярных выражениях V8

    Кажется, прошла незамеченной хорошая новость.

    Разработчики V8 активно взялись за добавление lookbehind assertions в регулярные выражения JavaScript.

    В Google Chrome Canary уже можно потестировать при помощи флага:

    chrome.exe --js-flags="--harmony-regexp-lookbehind"

    В этом месяце выходит шестая версия Node.js, основанная на V8 5.0, и в ней тоже можно включить поддержку lookbehind:

    node --harmony_regexp_lookbehind

    Если совсем не терпится, можно потестировать на уже появляющихся RC:

    nodejs.org/download/rc

    Я так протестировал положительный и отрицательный варианты на примере из статьи:



    Стоит обратить внимание на две особенности, упомянутые авторами:

    1. В отличие от Perl, оба варианта lookbehind поддерживают выражения переменной длины.

    2. Разработчики пошли по пути .NET и в другой особенности — установлен непривычный (для начала) порядок запоминания подвыражений и внутренних ссылок.

    P.S. Нововведение перешло на стадию флага --es_staging.
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 21

      +4
      В этом месяце выходит шестая версия Node.js, основанная на V8 5.0, и в ней уже можно включить поддержку lookbehind при помощи флага командной строки --harmony_regexp_lookbehind.

      На всякий случай напоминаю, что использовать --harmony-флаги в продакшне не рекомендуется.
      Даже если фича выглядит аддитивной — они иногда сегфолтятся.
        +2
        Так. Первый абзац в предыдущем комментарии — цитата из статьи. Мне хабр показал сработавший blockquote в предпросмотре, но вырезал его после отправки. А отредактировать я уже не могу.
          0
          Спасибо за комментарий и щепетильность. Вдвойне полезно от разработчика Node.js)

          Да, я это не к тому написал, чтобы всем вовсю использовать в продакшене. Скорее, чтобы тестировать и помогать в отладке. Похоже, это сейчас будет единственный удобный способ, с выходом Node.js 6.0.
            +1
            Я получил список флагов для ночной сборки с V8 4.9 при помощи node --v8-options > v8.txt. У многих ключей --harmony... есть приписка (in progress) в объяснениях. У --harmony_regexp_lookbehind такой приписки нет. Вы не знаете, стоит ли за этим какая-то принципиальная разница?
              +1
              Честно говоря, вот так не могу сказать. Предполагаю что первые точно не готовы, а вторые не оттестированы, но я в этом не уверен. Лучше поискать какую-нибудь информацию на эту приписку, где-то может быть описано.

              Но ни те ни другие в продакшне использовать не стоит. Для тестирования и разработки следующей версии — да, сколько угодно. А так накатаете в продакшн, какой-нибудь клиент пришлёт запрос на котором оно падает — будет нехорошо.
                0
                «This is pretty much done, but still hidden behind a flag. Do we wait till the proposal advances or do we just stage it?»

                «I'd argue we should leave this flipped off until the proposal reaches at least Stage 2 (or maybe Stage 3) at TC-39. We don't know what kinds of subtle changes in semantics might come in the future, and we don't want to create an hazard where we might want to change the semantics that we ship later, as it could break websites.»

                https://bugs.chromium.org/p/v8/issues/detail?id=4545

                То есть, в принципе возможность отлажена, но останется под флагом, пока ещё больше не приблизится к стандарту. Наверное, для личного пользования уже можно рисковать.
                  0
                  Скрипт с этой возможностью запускается под любым из этих флагов, по крайней мере на Node.js 6 RC 2 (V8 5):

                  node --harmony_regexp_lookbehind test.js
                  node --harmony test.js
                  node --es_staging test.js

                    +1
                    Ну да.

                    --harmony_regexp_lookbehind — включает конкретную фичу, независимо от того, в каком она состоянии.
                    --es_staging — включает то, что считается готовым, но не стабильным/не оттестированым.
                    --harmony — уже синоним для --es-staging.

                    См. https://nodejs.org/en/docs/es6/ (но учтите, что конкретный список фич там для более старой версии).
                      0
                      А это уже синонимы как для разработчиков Node, так и для разработчиков V8?
                        +1
                        --es_staging (enable all completed harmony features)
                        --harmony (enable all completed harmony features)

                        Насколько я знаю — да.

                        Ещё: раньше (в Node.js 0.10/0.12) --harmony включал не только готовые фичи, а целую кучу всего совсем сырого.
                        Начиная с io.js 1.0 — так, как сейчас.

                        См. https://iojs.org/en/es6.html для истории.
                          0
                          Большое спасибо вам за все ответы.
                            +2
                            Так, с выходом Node.js 6 мой предыдущий комментарий перестал быть верным: в v8 значение --es-staging поменяли, теперь он включает несколько больше фич, чем --harmony, и отмечен как «только для внутреннего использования».

                            4.x, 5.x:
                            --es_staging (enable all completed harmony features)
                            --harmony (enable all completed harmony features)

                            6.0.0:
                            --es_staging (enable test-worthy harmony features (for internal use only))
                            --harmony (enable all completed harmony features)

                            Информацию по вышеприведённой ссылке скоро обновят.
                +1

                Сорри за оффтоп. Crажите включена ли поддержка Proxy в пятой версии v8 или так же придется использовать harmoni-флаги?

                  +1
                  Судя по официальному блогу, включена уже в 4.9.
                    +1

                    Ох ты ж! Мы еще и деструктивное присваивание получим! Не ожидал так скоро.

                    +2
                    Есть удобный сайт, где можно посмотреть информацию по фичам — https://www.chromestatus.com/
                      0
                      Спасибо. Есть ли какое-то соответствие между версией Хрома и v8, или бывают только случайные совпадения? Canary сейчас уже 52, но v8 в ней всё ещё 5.1.
                        0
                        Начиная с довольно старой версии, версия v8 равна версии хрома, делённой на 10. Но это относится к стабильным в основном. То есть как только хром 50 выходит (кстати, уже) — ветка v8 5.0 считается стабильной (опять же, уже).

                        Её как раз несколько минут назад вмерджили в Node.js master, так что в 6.0 будет v8 5.0. Это планировалось, но до конца не было ясно, так как график релизов Chrome/v8 не жёсткий (и стабильный релиз v8 5.0 мог быть отложен), а релиз Node.js 6.0 назначен на конец этого месяца.
                          0
                          А Node 6 RC 2 или релиз не будут из-за этого раньше выпускать?
                        +2
                        Тогда для Node можно использовать это — node.green
                        Я прав?
                          0
                          Можно, используйте =). Но она основывается на последних nightly сборках, а про то, что в Node.js 6.0 ожидается всё-таки v8 5.0, а не 4.9 (как сейчас в той табличке) — было известно давно. Но без стопроцентной гарантии.

                  Only users with full accounts can post comments. Log in, please.