Expressões Regulares e Métodos Comuns
- Definição: Expressões Regulares, ou Regex, são usadas para criar um "padrão", que você pode então usar para verificar uma string, extrair texto e mais.
const regex = /G.E.A.R ACADEMY/;
- Método
test(): Este método aceita uma string, que é a string a ser testada para correspondências contra a expressão regular. Este método retornará um booleano se a string corresponder ao regex.
const regex = /G.E.A.R ACADEMY/;
const test = regex.test("e");
console.log(test); // false
- Método
match(): Este método aceita uma expressão regular, embora você também possa passar uma string que será convertida em uma expressão regular. O método match retorna o array de correspondência para a string.
const regex = /G.E.A.R ACADEMY/;
const match = "G.E.A.R ACADEMY".match(regex);
console.log(match); // ['G.E.A.R ACADEMY', index: 0, input: 'G.E.A.R ACADEMY', groups: undefined]
- Método
replace(): Este método aceita dois argumentos: a expressão regular para corresponder (ou uma string) e a string para substituir a correspondência (ou uma função para executar em cada correspondência).
const regex = /Jessica/;
const str = "Jessica is rly kewl";
const replaced = str.replace(regex, "G.E.A.R ACADEMY");
console.log(replaced); // "G.E.A.R ACADEMY is rly kewl"
- Método
replaceAll: Este método é usado para substituir todas as ocorrências de um padrão especificado por uma nova string. Este método lançará um erro se você fornecer uma expressão regular sem o modificador global.
const text = "I hate JavaScript! I hate programming!";
const newText = text.replaceAll("hate", "love");
console.log(newText); // "I love JavaScript! I love programming!"
- Método
matchAll: Este método é usado para recuperar todas as correspondências de uma expressão regular dada em uma string, incluindo grupos de captura, e as retorna como um iterador. Um iterador é um objeto que permite percorrer (ou "iterar sobre") uma coleção de itens.
const str = "JavaScript, Python, JavaScript, Swift, JavaScript";
const regex = /JavaScript/g;
const iterator = str.matchAll(regex);
for (let match of iterator) {
console.log(match[0]); // "JavaScript" for each match
}
Modificadores de Expressão Regular
- Definição: Modificadores, frequentemente chamados de "flags", modificam o comportamento de uma expressão regular.
- Bandeira
i: Esta bandeira faz com que uma regex ignore maiúsculas e minúsculas.
const regex = /G.E.A.R ACADEMY/i;
console.log(regex.test("G.E.A.R ACADEMY")); // true
console.log(regex.test("G.E.A.R ACADEMY")); // true
- Flag
g: Esta flag, ou modificador global, permite que sua expressão regular corresponda a um padrão mais de uma vez.
const regex = /G.E.A.R ACADEMY/gi;
console.log(regex.test("G.E.A.R ACADEMY")); // true
console.log(regex.test("G.E.A.R ACADEMY is great")); // false
- Definição de Anchor: O
^ anchor, no início da expressão regular, indica "corresponder ao início da string". O $ anchor, no final da expressão regular, indica "corresponder ao final da string".
const start = /^G.E.A.R ACADEMY/i;
const end = /G.E.A.R ACADEMY$/i;
console.log(start.test("G.E.A.R ACADEMY")); // true
console.log(end.test("G.E.A.R ACADEMY")); // true
- Flag
m: Os âncoras procuram o início e o fim de toda a string. Mas você pode fazer uma regex lidar com múltiplas linhas com a flag m, ou o modificador multi-linha.
const start = /^G.E.A.R ACADEMY/im;
const end = /G.E.A.R ACADEMY$/im;
const str = `I love
G.E.A.R ACADEMY
it's my favorite
`;
console.log(start.test(str)); // true
console.log(end.test(str)); // true
- Flag
d: Esta flag expande as informações que você obtém em um objeto de correspondência.
const regex = /G.E.A.R ACADEMY/di;
const string = "we love G.E.A.R ACADEMY isn't G.E.A.R ACADEMY great?";
console.log(string.match(regex));
E o resultado é:
// [
// 'G.E.A.R ACADEMY',
// index: 8,
// input: "we love G.E.A.R ACADEMY isn't G.E.A.R ACADEMY great?",
// groups: undefined,
// indices: [
// 0: [8, 20],
// groups: undefined
// ]
// ]
- Bandeira
u: Isso expande a funcionalidade de uma expressão regular para permitir que ela corresponda a caracteres unicode especiais. A bandeira u dá acesso a classes especiais como a Extended_Pictographic para corresponder à maioria dos emojis. Também existe uma bandeira v, que expande ainda mais a funcionalidade da correspondência unicode.
- Flag
y: O modificador sticky se comporta de forma muito semelhante ao modificador global, mas com algumas exceções. A maior delas é que uma expressão regular global começará a partir de lastIndex e buscará em todo o restante da string por outra correspondência, mas uma expressão regular sticky retornará null e resetará o lastIndex para 0 se não houver uma correspondência imediatamente no lastIndex anterior.
- Flag
s: O modificador de linha única permite que um caractere curinga, representado por um . em regex, corresponda a quebras de linha - tratando efetivamente a string como uma única linha de texto.
Classes de Caracteres
- Curinga
.: Classes de caracteres são uma sintaxe especial que você pode usar para corresponder a conjuntos ou subconjuntos de caracteres. A primeira classe de caracteres que você deve aprender é a classe curinga. O curinga é representado por um ponto e corresponde a QUALQUER caractere único EXCETO quebras de linha. Para permitir que a classe curinga corresponda a quebras de linha, lembre-se de que você precisaria usar a flag s.
const regex = /a./;
\d: Isso irá corresponder a todos os dígitos (0-9) em uma string.
const regex = /\d/;
\w: Isso é usado para corresponder a qualquer caractere de palavra (a-z0-9_) em uma string. Um caractere de palavra é definido como qualquer letra, de a a z, ou um número de 0 a 9, ou o caractere underscore.
const regex = /\w/;
\s: A classe de espaço em branco \s, representada por uma barra invertida seguida de um s. Essa classe de caracteres corresponderá a qualquer espaço em branco, incluindo quebras de linha, espaços, tabulações e caracteres especiais de espaço unicode.
- Negando Classes de Caracteres Especiais: Para negar uma dessas classes de caracteres, em vez de usar uma letra minúscula após a barra invertida, você pode usar o equivalente em maiúscula. O exemplo a seguir não corresponde a um caractere numérico. Em vez disso, corresponde a qualquer caractere único que NÃO seja um caractere numérico.
const regex = /\D/;
- Classes de Caracteres Personalizadas: Você pode criar classes de caracteres personalizadas colocando o caractere que deseja corresponder dentro de um conjunto de colchetes.
const regex = /[abcdf]/;
Asserções Lookahead e Lookbehind
- Definição: Asserções de lookahead e lookbehind permitem que você combine padrões específicos com base na presença ou ausência de padrões ao redor.
- Positive Lookahead Assertion: This assertion will match a pattern when the pattern is followed by another pattern. Para construir um lookahead positivo, você precisa começar com o padrão que deseja corresponder. Então, use parênteses para envolver o padrão que você quer usar como sua condição. Após o parêntese de abertura, use
?= para definir esse padrão como um lookahead positivo.
const regex = /free(?=code)/i;
- Negative Lookahead Assertion: Este é um tipo de condição usada em expressões regulares para verificar que um determinado padrão não ocorre à frente na string.
const regex = /free(?!code)/i;
- Positive Lookbehind Assertion: Esta asserção corresponderá a um padrão somente se ele for precedido por outro padrão específico, sem incluir o padrão precedente na correspondência.
const regex = /(?<=free)code/i;
- Negative Lookbehind Assertion: Esta asserção garante que um padrão não seja precedido por outro padrão específico. Ela corresponde apenas se o padrão especificado não for imediatamente precedido pela sequência dada, sem incluir a sequência precedente na correspondência.
const regex = /(?<!free)code/i;
Quantificadores de Regex
- Definição: Quantificadores em expressões regulares especificam quantas vezes um padrão (ou parte de um padrão) deve aparecer. Eles ajudam a controlar o número de ocorrências de caracteres ou grupos em uma correspondência. O exemplo a seguir é usado para corresponder ao caractere anterior exatamente quatro vezes.
const regex = /^\d{4}$/;
* : Corresponde a 0 ou mais ocorrências do elemento precedente.
+: Corresponde a 1 ou mais ocorrências do elemento precedente.
?: Corresponde a 0 ou 1 ocorrência do elemento precedente.
{n}: Corresponde exatamente a n ocorrências do elemento precedente.
{n,}: Corresponde a n ou mais ocorrências do elemento precedente.
{n,m}: Corresponde entre n e m ocorrências do elemento precedente.
Grupos de Captura e Referências Retroativas
- Grupos de Captura: Um grupo de captura permite que você "capture" uma parte da string correspondida para usar como precisar. Grupos de captura são definidos por parênteses contendo o padrão a ser capturado, sem caracteres iniciais como um lookahead.
const regex = /free(code)camp/i;
- Grupos Não Capturantes: Um grupo não capturante é semelhante a um grupo capturante mas não armazena a parte da string que correspondeu para uso posterior. Grupos não capturantes são definidos por
(?:...).
const regex = /free(?:code)camp/i;
- Backreferences: Uma backreference em expressões regulares refere-se a uma forma de reutilizar uma parte do padrão que foi correspondida anteriormente na mesma expressão. Ela permite que você se refira a um grupo capturado (uma parte do padrão entre parênteses) pelo seu número. Por exemplo,
$1 refere-se ao primeiro grupo capturado.
const regex = /free(co+de)camp/i;
console.log("freecoooooooodecamp".replace(regex, "paid$1world"));
- Você pode usar retroreferências dentro do próprio regex para corresponder ao mesmo texto capturado por um grupo anterior com uma barra invertida e o número do grupo de captura. Por exemplo:
const regex = /(hello) \1/i;
console.log(regex.test("hello hello")); // true
console.log(regex.test("hello world")); // false