Sintaxe de Expressões Regulares - JavaScript
Definição de Classes de Caracteres
Para definir expressões regulares, podemos usar classes de caracteres. As classes de caracteres são definidas usando colchetes:
(correspondência alternativa): corresponde a um dos caracteres: x, y ou z. É equivalente a x|y|z.[xyz]
(negação): corresponde a qualquer caractere EXCETO x, y ou z.[^xyz]
(intervalo): corresponde a qualquer caractere no intervalo de a-z ou A-Z.[a-zA-Z]
Por exemplo, para verificar se um texto contém os caracteres "a", "b" ou "c":
const exp = /[abc]/; // corresponde a "a", "b" ou "c"
const str1 = "JavaScript";
const str2 = "Pascal";
const str3 = "Python";
console.log(exp.test(str1)); // true
console.log(exp.test(str2)); // true
console.log(exp.test(str3)); // false
A expressão [abc]
[abc]
a|b|c
Vamos a um exemplo mais prático. Suponha que temos códigos PIN de 4 dígitos e precisamos verificar se o código contém apenas dígitos:
const exp = /[0-9][0-9][0-9][0-9]/; // corresponde a quatro dígitos consecutivos
const code1 = "1234";
const code2 = "jav5";
const code3 = "3452";
console.log(exp.test(code1)); // true
console.log(exp.test(code2)); // false
console.log(exp.test(code3)); // true
A expressão [0-9][0-9][0-9][0-9]
[a-z][a-z][a-z][0-9]
Vale ressaltar que a expressão [0-9][0-9][0-9][0-9]
Outro exemplo - utilizando negação:
const exp = /[^a-z]/; // corresponde a qualquer caractere, exceto letras de a-z
const code1 = "zorro";
const code2 = "zorro5";
const code3 = "34521";
console.log(exp.test(code1)); // false
console.log(exp.test(code2)); // true
console.log(exp.test(code3)); // true
Aqui, as strings são verificadas para corresponder à expressão [^a-z]
Se necessário, podemos combinar expressões:
const exp = /[dt]o[nm]/; // corresponde às strings "dom", "tom", "don", "ton"
const str1 = "doma";
const str2 = "soma";
const str3 = "tona";
console.log(exp.test(str1)); // true
console.log(exp.test(str2)); // false
console.log(exp.test(str3)); // true
Nesse exemplo, a expressão regular [dt]o[nm]
Metacaracteres
Em vez de definir nossas próprias classes de caracteres, podemos usar as incorporadas, que também são chamadas de metacaracteres - símbolos que têm um significado específico:
: corresponde a qualquer dígito de 0 a 9. Equivalente à expressão\d
.[0-9]
: corresponde a qualquer caractere que não seja um dígito. Equivalente à expressão\D
.[^0-9]
: corresponde a qualquer letra, dígito ou sublinhado (intervalos A-Z, a-z, 0-9). Equivalente à expressão\w
.[a-zA-Z_0-9]
: corresponde a qualquer caractere que não seja uma letra, dígito ou sublinhado (ou seja, não está nos intervalos A-Z, a-z, 0-9). Equivalente à expressão\W
.[^\w]
: corresponde a um espaço em branco. Equivalente à expressão\s
.[\t\n\x0B\f\r]
: corresponde a qualquer caractere que não seja um espaço em branco. Equivalente à expressão\S
.[^\s]
: corresponde a qualquer caractere..
É importante notar que o metacaractere \w é aplicável apenas para letras do alfabeto latino.
Por exemplo, para verificar que um código possui apenas 4 dígitos, usamos anteriormente a expressão /[0-9][0-9][0-9][0-9]/
\d
const exp = /\d\d\d\d/; // corresponde a quatro dígitos consecutivos
const code1 = "1234";
const code2 = "jav5";
const code3 = "3452";
console.log(exp.test(code1)); // true
console.log(exp.test(code2)); // false
console.log(exp.test(code3)); // true
Outro exemplo: suponha que precisamos encontrar strings que contêm um número de telefone no formato +x-xxx-xxx-xxxx:
const exp = /\+\d-\d\d\d-\d\d\d-\d\d\d\d/;
const contact1 = "Email: mycomp@gmail.com";
const contact2 = "Phone: +1-234-567-8901";
console.log(exp.test(contact1)); // false
console.log(exp.test(contact2)); // true
Portanto, o número de telefone +1-234-567-8901 corresponde a /\+\d-\d\d\d-\d\d\d-\d\d\d\d/.
\+ | \d | - | \d | \d | \d | - | \d | \d | \d | - | \d | \d | \d | \d |
+ | 1 | - | 2 | 3 | 4 | - | 5 | 6 | 7 | - | 8 | 9 | 0 | 2 |
Note a barra antes do sinal de mais \+
Assim, na string "Phone: +1-234-567-8901", o método exp.test(contact2)
Limitando o Alcance de Expressões Regulares
Alguns caracteres especiais permitem limitar o alcance das expressões regulares:
: corresponde ao início da linha. Por exemplo, ^h corresponde à string "home", mas não a "ohma", pois o 'h' deve estar no início da linha.^
: corresponde ao fim da linha. Por exemplo, m$ corresponde à string "dom", porque a string deve terminar com a letra 'm'.$
: corresponde ao início ou ao fim de uma palavra.\b
: ignora os limites de palavras.\B
Por exemplo, se precisamos encontrar strings com um número de telefone:
const exp = /\d{10}/; // corresponde a 10 dígitos consecutivos
const phone1 = "+12345678901";
const phone2 = "42345678901";
console.log(exp.test(phone1)); // true
console.log(exp.test(phone2)); // true
A expressão /\d{10}/
^\d{10}
const exp = /^\d{10}/; // corresponde a 10 dígitos consecutivos
const phone1 = "+12345678901";
const phone2 = "42345678901";
console.log(exp.test(phone1)); // false
console.log(exp.test(phone2)); // true
Outro exemplo: suponha que precisamos verificar se uma string menciona o idioma "Java". Uma abordagem ingênua seria usar a expressão regular /Java/
const exp = /Java/;
const str1 = "Java is a high-level, object-oriented programming language";
const str2 = "JavaScript is a programming language of the World Wide Web";
console.log(exp.test(str1)); // true
console.log(exp.test(str2)); // true
No entanto, na realidade, o padrão /Java/
\b
const exp = /Java\b/; //
const str1 = "Java is a high-level, object-oriented programming language";
const str2 = "JavaScript is a programming language of the World Wide Web";
console.log(exp.test(str1)); // true
console.log(exp.test(str2)); // false
O flag \B
const exp = /Java\B/;
const str1 = "Java is a high-level, object-oriented programming language";
const str2 = "JavaScript is a programming language of the World Wide Web";
console.log(exp.test(str1)); // false
console.log(exp.test(str2)); // true
Flags em Expressões Regulares
Os flags permitem ajustar o comportamento das expressões regulares. Cada flag é representado por um caractere específico que é colocado no final da expressão regular. Em JavaScript, os seguintes flags são usados:
: Permite encontrar todas as substrings que correspondem à expressão regular. Por padrão, uma expressão regular encontra a primeira substring correspondente em uma string. Se houver várias substrings que correspondem, o flagFlag global (g)
é usado para identificá-las.g
: Permite encontrar substrings que correspondem à expressão regular, independentemente do case (maiúsculas ou minúsculas). Isso é feito usando o caractereFlag ignoreCase (i)
nas expressões regulares.i
: Permite encontrar substrings que correspondem à expressão regular em um texto com várias linhas. Isso é feito usando o caractereFlag multiline (m)
nas expressões regulares.m
: Permite que o caractere ponto (.) em uma expressão regular corresponda a qualquer caractere, incluindo delimitadores de linha. Isso é feito usando o caractere s nas expressões regulares.Flag dotAll (s)
O flag i (ignoreCase)
Exemplo:
const str = "Hello World";
const exp = /world/;
console.log(exp.test(str)); // false
// Usando o flag i para ignorar o case
const expWithIgnoreCase = /world/i;
console.log(expWithIgnoreCase.test(str)); // true
Note onde o flag é colocado na expressão regular: /world/i
O flag s (dotAll)
Exemplo:
const str = "hello\nworld";
const exp = /hello world/;
console.log(exp.test(str)); // false
// Usando o flag s para que a expressão regular ignore o delimitador de linha
const expWithDotAll = /hello.world/s;
console.log(expWithDotAll.test(str)); // true
Neste exemplo, a expressão /hello.world/s
Combinando flags:
É possível usar vários flags simultaneamente:
const str = "hello\nWorld";
const exp = /hello.world/si;
console.log(exp.test(str)); // true
Aqui, os flags s
i