Задать вопрос

Регулярные выражения, использующие lookbehind, на языке JavaScript. Есть ли готовый код, решающий эту проблему раз и навсегда?

Как известно, на языке JavaScript вам не удастся попросту записать на языке регулярных выражений нечто подобное:someString.replace(/(?<!([abcdef]))gh/, …)

Не удастся потому, что в джаваскрипте нет учёта символов, предшествующих найденному выражению, то есть нет того, что называется «lookbehind assertions» — уж не знаю, есть ли устоявшийся термин для этого кода («(?<!……)») на русском языке.


Естественно, что программисты, использующие JavaScript, выработали целый ряд приёмов, позволяющих обойти этот недостаток. (Вон там перечислены многие такие трюки, например.)


Сейчас меня интересует кое-что другое, однако же. Не было ли в истории открытого кода каких-нибудь попыток окончательно решить эту проблему раз и навсегда — например, портировав библиотеку PCRE на язык JavaScript целиком?


Вопрос может показаться довольно дерзким по своему замаху, я знаю; однако, в конце концов, в истории не раз случались масштабные (и успешные!) попытки портировать или эмулировать на JavaScript то да сё; например, эмулятор Commodore 64 (о котором я упоминал на Хабрахабре прошлой зимою), или реализация многих функций PHP на JavaScript с открытым кодом, и так далее. Вдруг и с PCRE что-то подобноекому-нибудь удалось достигнуть, а я просто не знаю?


Опять же и попытки добавить в JavaScript новые флаги и элементы регулярных выражений также производились — XRegExp, например. Правда, в нём нету lookbehind, к сожалению.
  • Вопрос задан
  • 4783 просмотра
Подписаться 8 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
taliban
@taliban
php программист
Можно конечно это все портировать, но тогда это будет бессмысленное занятие. Это будет на столько медленно, что Вы не будете это использовать. Эмуляция, по сути своей, ведь будет набором indexOf.
Ответ написан
hayk
@hayk
Кажется «lookbehind assertions» — это «ретроспективная проверка», а «lookahead assertions» — «опережающая проверка».
Ответ написан
Комментировать
Уже доступно со специальными флагами, скоро будет доступно везде.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы