Percursos
/
JavaScript
JavaScript
/
Exercícios
/
Chatbot de expressões regulares
Chatbot de expressões regulares

Chatbot de expressões regulares

Exercício de aprendizagem

Introdução

Expressões regulares em JavaScript

Uma expressão regular (ou regex) é uma sequência de carateres que podemos usar para atingir e manipular determinados elementos em strings. Assim, podemos:

  • Procurar um texto numa string
  • Substituir substrings numa string
  • Extrair informação de uma string

💡 A variante de regex do JavaScript faz parte da norma ECMA-262 para a linguagem. Isto significa que não tens de te preocupar com a compatibilidade específica de cada navegador.

Como criar expressões regulares

Em JavaScript, uma expressão regular escreve-se geralmente no formato /pattern/modifiers.

Temos duas formas de criar uma expressão regular:

  1. Literal de expressão regular:
const regex = /[a-z]/;
  1. Construtor RegExp:
const regex = new RegExp('[a-z]');

Em ambos os casos, o JavaScript cria um objeto a partir da regex. Recomenda-se usar padrões imutáveis, com o literal por predefinição.

O construtor RegExp pode ser usado nos casos em que a regex vai mudar ou ainda não a conhecemos (como um valor de entrada).

🏴‍☠️ Flags

As expressões regulares têm superpoderes opcionais chamados flags que permitem funcionalidades adicionais.

Algumas das mais usadas são:

  • /g - Pesquisa global
  • /i - Não distinguir maiúsculas de minúsculas
  • /m - Pesquisa multilinha

Eis um exemplo simples:

const re = /home/gi;
const str = 'Home, sweet home.';
const myArray = str.match(re);
console.log(myArray);

=> // ["Home", "home"]

O caráter g permite-nos analisar todas as correspondências possíveis numa string. Sem esta funcionalidade, o JavaScript teria extraído apenas a primeira correspondência Home.

A flag de não distinguir maiúsculas de minúsculas /i torna-nos flexíveis na procura de 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)

Funções mais comuns

Quando as expressões regulares se combinam com as funções incorporadas do JavaScript, temos formas poderosas de manipular e obter dados a partir de strings.

Estas são algumas das funções mais comuns usadas em conjunto com expressões regulares.

Test

O método test() executa uma procura de correspondência entre uma expressão regular e uma string especificada. Devolve true ou false.

const str = 'It is difficult to test if you have a virus';
const result = /virus$/.test(str);

console.log(result);

// => true

Match

Com o método match(), obtemos um array útil cujo conteúdo depende da presença ou ausência das correspondências encontradas.

Desta forma, conseguimos tanto procurar como extrair informação 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 pesquisa global /g está presente, em vez de obtermos apenas a correspondência única com informação útil como o index ou o input, o método devolve todas as ocorrências apresentadas 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"];

Replace

O método replace() em JavaScript permite-nos procurar um valor numa string e substituí-lo pelo novo valor pretendido.

string.replace(searchValue, newValue);

O padrão para procurar a 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 a 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"

Split

O método split() em JavaScript representa uma forma diferente de usar e manipular strings com expressões regulares.

Desta forma, vamos usar expressões regulares para dividir uma string dada, reconhecendo um padrão, por exemplo str.split(/[,.\s]/). Este padrão será usado como separator.

const str = 'hello,user.how are.you';

const result = str.split(/[,.\s]/);

console.log(result);
// => ['hello', 'user', 'how', 'are', 'you']

Instruções

Foste contratado como Especialista em Expressões Regulares numa empresa que está a desenvolver um Chatbot.

Está numa fase de desenvolvimento muito básica, por isso a tua missão é usar expressões regulares para melhorar a capacidade do chatbot de compreender e gerar linguagem natural.

Verifica se o comando é válido

Além de ser inteligente, o Chatbot é também um assistente leal.

Para pedir algo ao chatbot, o utilizador tem de dizer a palavra “Chatbot” na primeira posição do comando.

Não faz diferença se a palavra-chave está em MAIÚSCULAS ou minúsculas. O aspeto importante aqui é a posição da palavra.

Implementa a função isValidCommand() que ajuda o Chatbot a reconhecer quando o utilizador está a dar 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

Remove os emojis encriptados

O Chatbot tem dificuldade em compreender como os humanos usam os emojis para expressar as suas emoções.

Quando o chatbot recebe mensagens do utilizador, cada emoji é representado por “emoji” seguido do seu número id.

Implementa o método removeEmoji() para receber uma string e remover toda a encriptação dos emojis ao longo da mensagem.

As linhas que não contêm o texto do emoji devem ser devolvidas sem alterações.

Remove apenas a string do emoji. Não tentes ajustar o espaçamento.

Para este desafio em particular, usa 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"

Verifica se o número de telefone é válido

Tendo em conta que as funcionalidades do chatbot são descarregadas numa aplicação móvel, espera-se que o utilizador 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 carateres especificada pela expressão regular), o chatbot responde com uma mensagem a agradecer ao utilizador e a confirmar o número. Se o número for inválido, a função informa o utilizador de 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 muito curioso. Apesar de conseguir pesquisar na internet sobre um determinado tema, gosta de perguntar aos utilizadores por sites fixes ou URLs onde possa encontrar informação relevante.

Exemplo de conversa:

  • Chatbot: Olá username, gostaria de aprender a programar em JavaScript. Conheces algum site fixe onde possa aprender?
  • Utilizador: Aprendi imenso em exercism.org

Implementa a função getURL() que consegue devolver um array apenas com o link de cada site. Escrever uma regex para reconhecer qualquer URL seria muito complicado, mas o Chatbot só precisa de ler URLs simples. Para este exercício, um 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"];

Cumprimenta o utilizador

Para guardar os dados de todas as pessoas com quem conversou, o chatbot consegue obter o nome completo a partir do perfil do utilizador neste formato: “smith, john”.

Assim, queremos que o nosso chatbot seja muito educado e cause uma boa impressão.

Escreve a função niceToMeetYou() que recebe uma string com o nome completo do utilizador e devolve a string “Nice to meet you, John Smith”

Para fins de aprendizagem, implementa 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"
Editar via GitHub A ligação abre numa nova janela ou separador
JavaScript Exercism

Estás pronto para começar Chatbot de expressões regulares?

Inscreve-te no Exercism para aprenderes e dominares JavaScript com 37 conceitos159 exercícios, e mentoria humana real, tudo grátis.