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.