Uma expressão regular (ou regex) é uma sequência de caracteres que podemos usar para localizar e manipular certos elementos em strings. Com ela, podemos:
💡 A variante de regex do JavaScript faz parte do padrão ECMA-262 da linguagem. Isso significa que você não precisa se preocupar com compatibilidade específica de cada navegador.
Em JavaScript, uma expressão regular geralmente é escrita no formato /pattern/modifiers.
Temos duas formas de criar uma expressão regular:
const regex = /[a-z]/;
const regex = new RegExp('[a-z]');
Nos dois casos, o JavaScript cria um objeto a partir da regex. Recomenda-se usar padrões imutáveis, com o literal como padrão.
O construtor RegExp pode ser usado em casos em que a regex vai mudar ou ainda não a conhecemos (como uma entrada).
As expressões regulares têm superpoderes opcionais chamados flags, que permitem recursos adicionais.
Algumas das mais usadas são:
/g - Busca global/i - Sem distinção entre maiúsculas e minúsculas/m - Busca multilinhaVeja um exemplo simples:
const re = /home/gi;
const str = 'Home, sweet home.';
const myArray = str.match(re);
console.log(myArray);
=> // ["Home", "home"]
O caractere g permite encontrar todas as correspondências possíveis dentro de uma string. Sem esse recurso, o JavaScript extrairia apenas a primeira correspondência de Home.
A flag de distinção entre maiúsculas e minúsculas /i nos dá flexibilidade na hora de encontrar um padrão. Assim, não importa se o que procuramos está em UPPERCASE ou lowercase.
Ao usar o construtor RegExp, a sintaxe para adicionar flags é diferente.
let regex = /[a-z]/gi; // literal notation
let regex = new RegExp('[a-z]', 'gi'); // constructor with string pattern as first argument
let regex = new RegExp(/[a-z]/, 'gi'); // constructor with regular expression literal as first argument (Starting with ECMAScript 6)
Quando as expressões regulares se combinam com as funções nativas atuais do JavaScript, ganhamos formas poderosas de manipular e extrair dados de strings.
Estas são algumas das funções mais comuns usadas junto com regex.
O método test() executa uma busca por uma correspondência entre uma expressão regular e uma string especificada. Retorna true ou false.
const str = 'It is difficult to test if you have a virus';
const result = /virus$/.test(str);
console.log(result);
// => true
Com o método match(), obtemos um array útil cujo conteúdo depende da presença ou ausência das correspondências encontradas.
Assim, somos capazes tanto de buscar quanto de extrair informações de qualquer string. Por exemplo:
const funnyQuote =
'If you see someone crying, ask if it is because of their haircut.';
const regex1 = /someone/;
const regex2 = /happy/;
funnyQuote.match(regex1);
// => ["someone", index: 11, input: "If you see someone crying, ask if it is because of their haircut.", groups: undefined]
funnyQuote.match(regex2);
// => null
Quando a flag de busca global /g está presente, em vez de obter apenas a correspondência junto com informações úteis como o índice ou a entrada, o método retorna todas as ocorrências exibidas no array:
const funnyQuote =
'If you see someone crying, ask if it is because of their haircut.';
const regex3 = /if/gi;
funnyQuote.match(regex3);
// => ["If", "if"];
O método replace() em JavaScript permite buscar um valor dentro de uma string e substituí-lo por um novo valor desejado.
string.replace(searchValue, newValue);
O padrão usado na busca pela substituição pode ser uma única string ou uma expressão regular.
let string = 'I like dogs!';
let result = string.replace('dogs', 'cats');
let string = 'I would love to travel to Japan';
let result = string.replace(/Japan/g, 'Hawaii');
Além disso, podemos aplicar uma função na posição de substituição para fazer alterações adicionais em cada valor.
let text = 'Say hello to the chatbot.';
let result = text.replace(/chatbot|hello/gi, function (word) {
return word.toUpperCase();
});
// => "Say HELLO to the CHATBOT"
O método split() em JavaScript representa uma forma diferente de usar e manipular strings com expressões regulares.
Assim, usaremos regex para dividir uma string reconhecendo um padrão, por exemplo str.split(/[,.\s]/). Esse padrão será usado como o separator.
const str = 'hello,user.how are.you';
const result = str.split(/[,.\s]/);
console.log(result);
// => ['hello', 'user', 'how', 'are', 'you']
Você acaba de entrar para uma empresa que está desenvolvendo um Chatbot, no cargo de Especialista em Expressões Regulares.
O projeto está em uma fase bem básica de desenvolvimento, então sua missão é usar Expressões Regulares para melhorar a capacidade do chatbot de entender e gerar linguagem natural.
Além de ser inteligente, o Chatbot também é um assistente leal.
Para pedir algo ao chatbot, é preciso dizer a palavra “Chatbot” na primeira posição do comando.
Não importa se a palavra-chave está em MAIÚSCULAS ou minúsculas. O que importa aqui é a posição da palavra.
Implemente a função isValidCommand() que ajuda o Chatbot a reconhecer quando o usuário está dando um comando.
isValidCommand("Chatbot, play a song from the 80's.";
// => True
isValidCommand("Hey Chatbot, where is the closest pharmacy?";
// => False
isValidCommand("CHATBOT, do you have a solution for this challenge?";
// => True
O Chatbot tem dificuldade para entender como as pessoas usam emojis para expressar suas emoções.
Quando o chatbot recebe mensagens do usuário, cada emoji é representado como “emoji” seguido do seu número de id.
Implemente o método removeEmoji() para receber uma string e remover toda a criptografia de emoji da mensagem.
Linhas que não contêm texto de emoji devem ser retornadas sem modificação.
Remova apenas a string do emoji. Não tente ajustar os espaços em branco.
Para este desafio em particular, use a sintaxe de construtor para criar a expressão regular.
removeEmoji("I love playing videogames emoji3465 it's one of my hobbies");
// => "I love playing videogames it's one of my hobbies"
Com os recursos do chatbot disponíveis em um aplicativo de celular, espera-se que o usuário escreva um número de telefone durante a conversa.
O problema é que o chatbot só consegue ler e validar um número com um formato específico.
Se o número for válido (corresponder à sequência de caracteres especificada pela expressão regular), o chatbot responde com uma mensagem agradecendo e confirmando o número. Se o número for inválido, a função informa ao usuário que o número de telefone não é válido.
O formato esperado é: (+##) ###-###-###
checkPhoneNumber('(+34) 659-771-594');
// => "Thanks! You can now download me to your phone."
checkPhoneNumber('659-771-594');
// => "Oops, it seems like I can't reach out to 659-771-594"
O Chatbot é um software bastante curioso. Mesmo conseguindo pesquisar na internet sobre um assunto específico, ele gosta de perguntar ao usuário sobre sites legais ou URLs para encontrar informações relevantes.
Exemplo de conversa:
Implemente a função getURL(), capaz de retornar um array apenas com o link de cada site. Escrever uma regex para reconhecer qualquer URL seria muito complicado, mas o Chatbot só precisa ler URLs simples. Neste exercício, uma URL é qualquer sequência de palavras delimitada por ".".
getURL(
'I learned a lot from exercism.org and developer.mozilla.org, but I found ts39.es very boring!',
);
// => ["exercism.org", "developer.mozilla.org", "ts39.es"];
Para armazenar dados de todas as pessoas que já conversaram com ele, o chatbot consegue obter o Nome Completo a partir do perfil do usuário, neste formato: “smith, john”.
Assim, queremos que nosso chatbot seja bem educado e cause uma boa impressão.
Escreva a função niceToMeetYou() que recebe uma string com o nome completo do usuário e retorna a string “Nice to meet you, John Smith”
Para fins de aprendizado, implemente a função usando um método de substituição das Expressões Regulares.
let str = 'Smith, John';
niceToMeetYou(str);
// => "Nice to meet you, John Smith"
Crie sua conta no Exercism para aprender e dominar JavaScript com 37 conceitos159 exercícios e mentoria humana de verdade, tudo de graça.