voltar aos artigosadvanced topics
$cd~/artigos/regular-expressions-javascript-expressoes-regulares
Advanced Topics
série 33 Conceitos JS·parte 32 de 38

Regular Expressions: O Detetive do Texto

20 minVanderlei José Alamino

"Dê-me um padrão e encontrarei uma agulha no palheiro. Dê-me um regex e encontrarei todas as agulhas, em ordem, com seus números de série."

Uma expressão regular descreve padrões em strings — validar email, extrair telefones, substituir texto. Em JavaScript, regex são objetos usados com métodos de string.

snippetJavaScript
const phone = /\d{3}-\d{4}/;phone.test('Ligue 555-1234 hoje');  // true'555-1234'.match(phone);             // ["555-1234"]

Neste guia da série 33 Conceitos JS — projeto open source criado por Leonardo Maldonado — você aprende sintaxe, métodos, flags, grupos e padrões do mundo real.

Pré-requisitos: Primitive Types (strings) e Map, Reduce & Filter — processar arrays de matches com HOFs.

regular-expressions-javascript-expressoes-regulares.meta.jsonjson

// metadados do artigo

{
  "tag": "advanced topics",
  "readTime": "20 min",
  "author": "Vanderlei José Alamino",
  "source": "33jsconcepts.com",
  "series": "33 Conceitos JS",
  "part": {
    "current": 32,
    "total": 38
  }
}
abrir fonte original
regular-expressions-javascript-expressoes-regulares.mdmarkdown

Fonte de referência

Conteúdo adaptado a partir do guia original em inglês.

33jsconcepts.com
01

seção

Analogia: O Detetive na Multidão

snippettext
Padrão /\d{3}-\d{4}/  em  "Ligue 555-1234 hoje"  → \d{3} = "555" ✓  →  "-" ✓  →  \d{4} = "1234" ✓  Match: "555-1234"
DetetiveRegexExemplo
Nome exatoLiteral abc/hello/
Tipo de pessoaClasse [aeiou]vogais
RepetiçãoQuantificador a+um ou mais a
Posição na filaÂncora ^ $início/fim
02

seção

Duas Formas de Criar Regex

snippetJavaScript
// Literal — padrão estático (compilado no load)const pattern1 = /hello/; // Construtor — padrão dinâmico (runtime)const pattern2 = new RegExp('hello'); function findWord(text, word) {  return text.match(new RegExp(word, 'gi'));}

Use literal quando o padrão é fixo. Use new RegExp() com input de usuário — lembre de escapar backslashes: new RegExp('\\d+').

Padrões inválidos lançam SyntaxError — veja Error Handling.

03

seção

Classes de Caracteres

PadrãoCombina
.Qualquer char exceto newline
\d / \DDígito / não-dígito
\w / \WPalavra / não-palavra
\s / \SWhitespace / não-whitespace
[abc] / [^abc]Qualquer de / nenhum de
[a-z]Range
snippetJavaScript
/\d{3}-\d{4}/.test('555-1234');  // true'hello_world 123!'.match(/\w+/g);  // ["hello_world", "123"]
04

seção

Quantificadores

QuantificadorSignificado
*0 ou mais
+1 ou mais
?0 ou 1 (opcional)
{n}Exatamente n
{n,}n ou mais
{n,m}Entre n e m
snippetJavaScript
/apple(s)?/.test('apples');   // true'I have 42 and 7'.match(/\d+/g);  // ["42", "7"]
05

seção

Âncoras

ÂncoraPosição
^Início (ou linha com m)
$Fim (ou linha com m)
\bBorda de palavra
\BNão-borda
snippetJavaScript
/^Hello/.test('Hello World');  // true/\d$/.test('Room 42');           // true/\bcat\b/.test('category');      // false — match parcial

\b combina posição, não caractere — evita casar cat dentro de category.

06

seção

Métodos Principais

MétodoRetornaUso
regex.test(str)booleanValidação
str.match(regex)array ou nullEncontrar
str.matchAll(regex)iteratorTodos + detalhes (g obrigatório)
str.search(regex)índice ou -1Posição
str.replace(regex, rep)stringSubstituir
str.split(regex)arrayDividir
regex.exec(str)match ou nullDetalhes (stateful com g)
snippetJavaScript
'My numbers: 123, 456'.match(/\d+/g);     // ["123", "456"]'hello world'.replace(/o/g, '0');          // "hell0 w0rld"'a, b,c'.split(/\s*,\s*/);                 // ["a", "b", "c"]

match() sem g: primeiro match com índice e grupos. Com g: só strings, todos os matches.

07

seção

Flags

FlagEfeito
gGlobal — todos os matches
iCase-insensitive
mMultiline — ^/$ por linha
sDotAll — . inclui newline
snippetJavaScript
/hello/i.test('HELLO');           // true'abcabc'.match(/a/g);              // ["a", "a"]'line1\nline2'.match(/^line\d/gm); // ["line1", "line2"]
08

seção

Grupos de Captura

Parênteses () capturam partes do match:

snippetJavaScript
const m = '(555) 123-4567'.match(/\((\d{3})\) (\d{3}-\d{4})/);m[1];  // "555"m[2];  // "123-4567"

Grupos nomeados (ES2018):

snippetJavaScript
const d = '12-25-2024'.match(/(?<month>\d{2})-(?<day>\d{2})-(?<year>\d{4})/);d.groups.year;  // "2024"

Replace com grupos: 'John Smith'.replace(/(\w+) (\w+)/, '$2, $1') → "Smith, John".

09

seção

Greedy vs Lazy — Armadilha #1

Quantificadores são greedy por padrão — casam o máximo possível. Adicione ? para lazy:

snippetJavaScript
const html = '<div>Hello</div><div>World</div>'; html.match(/<div>.*<\/div>/)[0];// "<div>Hello</div><div>World</div>" — greedy html.match(/<div>.*?<\/div>/)[0];// "<div>Hello</div>" — lazy

Entre delimitadores (tags, aspas, brackets), prefira *?, +?.

10

seção

Padrões do Mundo Real

snippetJavaScript
const email = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;const url = /^https?:\/\/[^\s]+$/;const phone = /^(\(\d{3}\)|\d{3})[-.\s]?\d{3}[-.\s]?\d{4}$/;const username = /^[a-zA-Z0-9_]{3,16}$/;

Regex é ótimo para pattern matching simples. Validação complexa (email RFC completo) → biblioteca dedicada.

Escape de input dinâmico:

snippetJavaScript
function escapeRegex(s) {  return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');}
11

seção

Perguntas Clássicas de Entrevista

12

seção

Teste Seu Conhecimento

$ summary --quick

Resumo rápido

  • Regex = padrões — descrevem o que procurar, não texto literal
  • /pattern/ vs RegExp() — estático vs dinâmico
  • Classes — \d \w \s . [abc] [a-z]
  • Quantificadores — * + ? {n,m}
  • Âncoras — ^ $ \b \B
  • test() valida; match() extrai; replace() substitui
  • Flags — g global, i case-insensitive, m multiline
  • Grupos () — $1, $ em replace
  • Greedy vs lazy — *? entre delimitadores
  • Escape input — nunca RegExp(userInput) cru

Créditos da série

Este artigo faz parte de uma série de estudos inspirada no projeto 33 Conceitos JS, criado por Leonardo Maldonado. Todo o conteúdo original está disponível em 33jsconcepts.com.