⊗jsSpRELAB 133 of 294 menu

Пазітыўны і негатыўны прагляд у рэгулярках 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'

Прагляд назад

Аналагічным чынам ёсць пазітыўны прагляд назад - (?<= ). У наступным прыкладзе замена адбудзецца, толькі калі перад 'aaa' стаіць 'x':

'xaaa'.replace(/(?<=x)aaa/g, '!'); // верне 'x!'

І ёсць таксама негатыўны прагляд назад - (?<! ). У наступным прыкладзе замена адбудзецца, толькі калі перад 'aaa' не стаіць 'x':

'baaa'.replace(/(?<!x)aaa/g, '!'); // верне 'b!'

Практычныя задачы

Дадзены радок, які змяшчае імёны функцый:

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

Атрымайце масіў імёнаў функцый з радка.

Дадзены радок з тэгам:

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

Атрымайце масіў імёнаў атрыбутаў гэтага тэга.

Дадзены радок з зменнымі:

let str = '$aaa $bbb $ccc xxxx';

Атрымайце падрадкі, перад якімі стаіць знак даляра.

trhyplpten