⊗jsSpRELAB 133 of 294 menu

Lookahead e Lookbehind Positivos e Negativos em Expressões Regulares do JavaScript

Às vezes, é necessário resolver um problema deste tipo: encontrar a string 'aaa' e substituí-la por '!', mas apenas se depois de 'aaa' houver 'x', e o próprio 'x' não deve ser substituído. Se tentarmos resolver o problema 'de forma direta', não teremos sucesso:

'aaax baaa'.replace(/aaax/g, '!'); // retornará '! baaa', mas queríamos '!x baaa'

Lookahead

Para resolver o problema, é necessária uma forma de dizer que o 'x' não deve ser substituído. Isto é feito usando colchetes especiais (?= ), que apenas verificam, mas não consomem o caractere.

Estes colchetes são chamados de lookahead positivo. Positivo - porque o 'x' (no nosso caso) deve estar presente - somente então a substituição ocorrerá.

Vamos aplicar estes colchetes para resolver nossa tarefa:

'aaax aaab'.replace(/aaa(?=x)/g, '!'); // retornará '!x aaab'

Existe também o lookahead negativo - (?! ) - que, pelo contrário, diz que algo não deve estar presente. No próximo exemplo, a substituição ocorrerá apenas se depois de 'aaa' NÃO houver 'x':

'aaax aaab'.replace(/aaa(?!x)/g, '!'); // retornará 'aaax !b'

Lookbehind

Da mesma forma, existe o lookbehind positivo - (?<= ). No próximo exemplo, a substituição ocorrerá apenas se antes de 'aaa' houver 'x':

'xaaa'.replace(/(?<=x)aaa/g, '!'); // retornará 'x!'

E também existe o lookbehind negativo - (?. No próximo exemplo, a substituição ocorrerá apenas se antes de 'aaa' NÃO houver 'x':

'baaa'.replace(/(?<!x)aaa/g, '!'); // retornará 'b!'

Tarefas Práticas

Dada uma string contendo nomes de funções:

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

Obtenha um array com os nomes das funções a partir da string.

Dada uma string com uma tag:

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

Obtenha um array com os nomes dos atributos desta tag.

Dada uma string com variáveis:

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

Obtenha as substrings que são precedidas pelo símbolo de cifrão.

swcshuplms