Позитивный и негативный просмотр в JavaScript

Иногда нужно решить задачу такого типа: найти строку 'aaa' и заменить ее на '!', но только если после 'aaa' стоит 'x', а сам 'x' при этом не заменять. Если мы попытаемся решить задачу 'в лоб', то у нас ничего не выйдет:

'aaax baaa'.replace(/aaax/g, '!'); // вернет '! baaa', а хотели '!x baaa'

Позитивный просмотр вперед

Для решения задачи нужен способ сказать, что 'x' не следует заменять. Делается это с помощью специальных скобок (?= ), которые просто смотрят, но не забирают с собой.

Эти скобки называются позитивный просмотр вперед. Позитивный - так как 'x' (в нашем случае) должен быть - только тогда произойдет замена.

Давайте применим эти скобки для решения нашей задачи:

'aaax aaab'.replace(/aaa(?=x)/g, '!'); // вернет '!x aaab'

Негативный просмотр вперед

Есть и негативный просмотр вперед - (?! ) - он, наоборот, говорит, что чего-то должно не быть:

// Если после 'aaa' стоит НЕ 'x', тогда заменим на '!': 'aaax aaab'.replace(/aaa(?!x)/g, '!'); // вернет 'aaax !b'

Просмотр назад

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

Практические задачи

Дана строка, содержащая имена функций:

let str = 'func1() func2() func3()';

Получите массив имен функций из строки.

Дана строка с тегом:

let str = '<a href="" class="eee" id="zzz">';

Получите массив имен атрибутов этого тега.