Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Позитивный и негативный просмотр (https://javascript.ru/forum/misc/74228-pozitivnyjj-i-negativnyjj-prosmotr.html)

alecto 23.06.2018 17:33

Позитивный и негативный просмотр
 
подскажите пожалуйста, в чем может быть ошибка?

нужно вернуть 'x! baaa'
alert('xaaa baaa'.replace(/(?=x)aaa/g, '!'));

и 'xaaa b!' соответственно
alert('xaaa baaa'.replace(/(?!x)aaa/g, '!'));

вроде бы шаблоны собраны верно, но в результате возвращается исходная строка без изменений - в первом, и x! b! - во втором случае.
гугл не помог.

спасибо.

рони 23.06.2018 17:39

alecto,
alert('xaaa baaa'.replace(/(x)aaa/g, '$1!'));
alert('xaaa baaa'.replace(/([^x])aaa/g, '$1!'));

alecto 23.06.2018 17:42

вариант через карманы работает, но нужно именно через позитивный и негативный просмотр.
(?=x)
(?!x)
почему не работаю эти конструкции в регулярке?

Aetae 23.06.2018 17:55

A(?=X) - берёт символ А, после которого идёт X
AB - берёт символ А и символ B, который идёт за A
A(?=X)B - пытается найти A за которым идёт X и в то же время идёт B
Очевидно, последний вариант не найдёт ничего, потому что один и тот же символ, следующий за A, не может быть одновременно X и B.

?= и ?! "заглядывают" только вправо, если вам надо "заглядывать" влево - в регулярках как таковых для этого есть операторы(?<= и ?<! соответственно), но в javascript они не представлены.

alecto 23.06.2018 18:12

Понял свою ошибку!
Спасибо огромное за разъяснения!

Alexandroppolus 23.06.2018 18:43

Цитата:

Сообщение от Aetae
если вам надо "заглядывать" влево - в регулярках как таковых для этого есть операторы(?<= и ?<! соответственно), но в javascript они не представлены.

в новейшем стандарте добавились, и уже в Хроме

alecto 23.06.2018 22:55

спасибо огромное! то, что нужно!


Часовой пояс GMT +3, время: 16:36.