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

Разработчики 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.

Комментарии (20)


  1. ChALkeRx
    09.04.2016 12:00
    +4

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

    На всякий случай напоминаю, что использовать --harmony-флаги в продакшне не рекомендуется.
    Даже если фича выглядит аддитивной — они иногда сегфолтятся.


    1. ChALkeRx
      09.04.2016 12:09
      +2

      Так. Первый абзац в предыдущем комментарии — цитата из статьи. Мне хабр показал сработавший blockquote в предпросмотре, но вырезал его после отправки. А отредактировать я уже не могу.


      1. vmb
        09.04.2016 12:22

        Спасибо за комментарий и щепетильность. Вдвойне полезно от разработчика Node.js)

        Да, я это не к тому написал, чтобы всем вовсю использовать в продакшене. Скорее, чтобы тестировать и помогать в отладке. Похоже, это сейчас будет единственный удобный способ, с выходом Node.js 6.0.


      1. vmb
        09.04.2016 16:27
        +1

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


        1. ChALkeRx
          11.04.2016 16:08
          +1

          Честно говоря, вот так не могу сказать. Предполагаю что первые точно не готовы, а вторые не оттестированы, но я в этом не уверен. Лучше поискать какую-нибудь информацию на эту приписку, где-то может быть описано.

          Но ни те ни другие в продакшне использовать не стоит. Для тестирования и разработки следующей версии — да, сколько угодно. А так накатаете в продакшн, какой-нибудь клиент пришлёт запрос на котором оно падает — будет нехорошо.


          1. vmb
            15.04.2016 19:00

            «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

            То есть, в принципе возможность отлажена, но останется под флагом, пока ещё больше не приблизится к стандарту. Наверное, для личного пользования уже можно рисковать.


          1. vmb
            15.04.2016 19:18

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

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


            1. ChALkeRx
              16.04.2016 00:49
              +1

              Ну да.

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

              См. https://nodejs.org/en/docs/es6/ (но учтите, что конкретный список фич там для более старой версии).


              1. vmb
                16.04.2016 00:56

                А это уже синонимы как для разработчиков Node, так и для разработчиков V8?


                1. ChALkeRx
                  16.04.2016 01:04
                  +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 для истории.


                  1. vmb
                    16.04.2016 01:12

                    Большое спасибо вам за все ответы.


    1. rumkin
      11.04.2016 14:33
      +1

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


      1. vmb
        11.04.2016 14:38
        +1

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


        1. rumkin
          11.04.2016 16:03
          +1

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


      1. ChALkeRx
        11.04.2016 16:04
        +2

        Есть удобный сайт, где можно посмотреть информацию по фичам — https://www.chromestatus.com/


        1. vmb
          11.04.2016 16:20

          Спасибо. Есть ли какое-то соответствие между версией Хрома и v8, или бывают только случайные совпадения? Canary сейчас уже 52, но v8 в ней всё ещё 5.1.


          1. ChALkeRx
            14.04.2016 20:18

            Начиная с довольно старой версии, версия v8 равна версии хрома, делённой на 10. Но это относится к стабильным в основном. То есть как только хром 50 выходит (кстати, уже) — ветка v8 5.0 считается стабильной (опять же, уже).

            Её как раз несколько минут назад вмерджили в Node.js master, так что в 6.0 будет v8 5.0. Это планировалось, но до конца не было ясно, так как график релизов Chrome/v8 не жёсткий (и стабильный релиз v8 5.0 мог быть отложен), а релиз Node.js 6.0 назначен на конец этого месяца.


            1. vmb
              14.04.2016 20:40

              А Node 6 RC 2 или релиз не будут из-за этого раньше выпускать?


        1. iShatokhin
          12.04.2016 00:17
          +2

          Тогда для Node можно использовать это — node.green
          Я прав?


          1. ChALkeRx
            14.04.2016 20:22

            Можно, используйте =). Но она основывается на последних nightly сборках, а про то, что в Node.js 6.0 ожидается всё-таки v8 5.0, а не 4.9 (как сейчас в той табличке) — было известно давно. Но без стопроцентной гарантии.