Пазітыўны і негатыўны прагляд у рэгулярках 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';
Атрымайце падрадкі, перад якімі стаіць знак даляра.