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:

  • [xyz] (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.

  • [a-zA-Z] (intervalo): corresponde a qualquer caractere no intervalo de a-z ou A-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] indica que a string deve conter uma das três letras mencionadas. A expressão [abc] também é equivalente a 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] corresponde a qualquer sequência de 4 dígitos consecutivos. Por exemplo, ela corresponde à string "3452", mas NÃO à string "jav5" (que contém apenas um dígito). A string "jav5" corresponderia ao padrão [a-z][a-z][a-z][0-9] (três caracteres alfabéticos em minúsculas seguidos por um dígito).

Vale ressaltar que a expressão [0-9][0-9][0-9][0-9] não é otimizada, e mais adiante veremos como simplificá-la.

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], que corresponde a qualquer caractere exceto os do intervalo de a-z. Por exemplo, a string "zorro" NÃO corresponde a esta expressão, mas "zorro5" corresponde, pois contém um caractere fora do intervalo "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] verifica se a string contém "dom", "tom", "don", ou "ton".

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:

  • \d: corresponde a qualquer dígito de 0 a 9. Equivalente à expressão [0-9].

  • \D: corresponde a qualquer caractere que não seja um dígito. Equivalente à expressão [^0-9].

  • \w: corresponde a qualquer letra, dígito ou sublinhado (intervalos A-Z, a-z, 0-9). Equivalente à expressão [a-zA-Z_0-9].

  • \W: 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].

  • \s: corresponde a um espaço em branco. Equivalente à expressão [\t\n\x0B\f\r].

  • \S: corresponde a qualquer caractere que não seja um espaço em branco. Equivalente à expressão [^\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]/. Podemos simplificar isso usando o metacaractere \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 \+. Como o sinal de mais tem um significado especial, para indicar que nos referimos ao sinal de mais como um caractere de string, colocamos uma barra antes dele.

Assim, na string "Phone: +1-234-567-8901", o método exp.test(contact2) corresponderá à substring "+1-234-567-8901" no texto.

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'.

  • \b: corresponde ao início ou ao fim de uma palavra.

  • \B: ignora os limites de palavras.

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}/ corresponde tanto à string "+12345678901" quanto à "42345678901". No entanto, se precisamos encontrar números de telefone que não são precedidos por um sinal de mais "+", podemos usar a expressão regular ^\d{10}. Assim, a string corresponderá ao padrão se começar com caracteres numéricos:

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/ corresponde a qualquer string que contenha a substring "Java", incluindo "JavaScript". Mas se precisamos encontrar apenas aquelas strings que se referem especificamente ao Java, e não ao JavaScript, podemos limitar a pesquisa aos limites das palavras usando \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, por outro lado, indica que o padrão deve corresponder a substrings que não são palavras completas:

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:

  • Flag global (g): 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 flag g é usado para identificá-las.

  • Flag ignoreCase (i): Permite encontrar substrings que correspondem à expressão regular, independentemente do case (maiúsculas ou minúsculas). Isso é feito usando o caractere i nas expressões regulares.

  • Flag multiline (m): Permite encontrar substrings que correspondem à expressão regular em um texto com várias linhas. Isso é feito usando o caractere m nas expressões regulares.

  • Flag dotAll (s): 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.

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 — no final da expressão.

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 usa o ponto para representar qualquer caractere, permitindo que a expressão regular corresponda a texto multilinha.

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 e i são combinados, permitindo que a expressão regular corresponda independentemente do delimitador de linha e do case das letras.

Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com