Gestão Dev & TIARTIGO

Seja um desenvolvedor regular – adicionando expressões regulares no seu dia a dia

As expressões regulares são formadas por metacaracteres que, de acordo com a sua funcionalidade, dão mais poder às pesquisas.

Este artigo foi publicado no equinociOS, promovido pelo Cocoaheads-Br.

O que são expressões regulares

Expressão regular, vulgo regex, é um padrão de caractere que tem como objetivo identificar em uma string um padrão definido. Esse padrão pode ser palavras, caracteres específicos, números e expressões. Imagine o conjunto de palavras {sossego, prato, assadura, casa, passas} e você precisa separar todas as palavras que possuem ss. A primeira coisa que vem à mente é verificar palavra por palavra e checar se essa palavra contém ss. Com expressões regulares, você define um padrão e utiliza esse padrão para buscar as palavras que se encaixam nele. Se você for do tipo questionador, pode dizer: tá, mas isso eu faço com um if simples. Ok, concordo, mas e se quiser somente as palavras que contêm ss e que terminam com vogais (fica aí um exercício para quando terminar de ler o artigo)? É aí que entram as expressões regulares!

Como funcionam as expressões regulares

As expressões regulares são formadas por metacaracteres que, de acordo com a sua funcionalidade, dão mais poder às pesquisas. Elas formam padrões que, em alguns casos, são quase impossíveis de serem especificados utilizando caracteres comuns.

Os metacaracteres são divididos em 4 (quatro) grupos: Especificadores, Quantificadores, Âncoras e Agrupamento. Para facilitar o entendimento, segue abaixo uma tabela com cada caractere e sua funcionalidade, separados por grupos.

Especificadores

Especificam (daí o nome) um conjunto de caracteres a partir de uma posição.

Metacaractere Funcionalidade
. Qualquer caractere.
... Qualquer caractere incluído no conjunto.
^... Qualquer caractere não incluído no conjunto.
\d Qualquer caractere que seja um número (o mesmo que [0-9]).
\D Qualquer caractere que não seja um número (o mesmo que [^0-9]).
s Qualquer caractere branco (espaços, quebra de linha, tabs).
S Qualquer caractere não branco.
w Qualquer caractere alfa numérico.
W Qualquer caractere não alfa numérico.
\ Ignora o significado do próximo caractere na expressão. Ex.: Se quiser representar um . (ponto final), você utiliza \.. Dessa forma o . não vai representar qualquer caractere.

Quantificadores

Definem o número de repetições permitidas pela expressão anterior.

Metacaractere Funcionalidade
{n} Busca por exatamente n ocorrências. Ex.: A expressão \d{4} procura por um número de 4 dígitos.
{n,m} Busca por um mínimo de n e um máximo de m ocorrências.
{n,} Busca por no mínimo n ocorrências.
{,n} Busca por no máximo n ocorrências.
? Busca por 1 (uma) ou nenhuma ocorrência.
+ Busca por 1 (uma) ou mais ocorrências.
* Busca por 0 (zero) ou mais ocorrências.

Âncoras

Definem as posições de referência para o match da expressão regular.

Metacaractere Funcionalidade
^ Define a posição do início do texto ou de uma nova linha (em caso de textos multilinhas).
\A Define a posição do início do texto.
$ Define a posição do fim do texto ou de uma linha (em caso de textos multilinhas).
Z Define a posição do fim do texto.
b Define a posição de borda, ou seja, logo antes do início de uma palavra ou logo após o fim da palavra.
B Define a posição de não borda.

Agrupamento

Definem grupos.

Metacaractere Funcionalidade
(...) Define um grupo para aplicação de um quantificador.
...|... Define uma alternativa para a aplicação da expressão. A expressão deve dar match à direita ou à esquerda.
\n Recupera um match no grupo n.

Viu como as expressões são bem simples e, na maioria dos casos, os caracteres até fazem algum sentido?

Qual a vantagem das expressões regulares?

A grande vantagem de usar expressões regulares é poupar tempo. Elas são uma maneira simples de encontrar padrões. Você poderia escrever um if gigantesco e varrer cada caractere de uma string para validar o formato de um e-mail, por exemplo, ou pode usar um simples [A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}.

regular_expressions

Onde usar expressões regulares

As aplicações regulares no dia a dia do desenvolvedor são muitas. Você pode aplicar expressões regulares desde o console de debug (sim, o Xcode te dá essa opção) até nas validações de formulários. Um caso bem comum de aplicação de expressões regulares é na validação de e-mails. Além de e-mails, inúmeros campos podem ser validados com expressões regulares: telefones, CEPs, senhas, nomes, endereços, número de cartões de crédito etc.

Como usar expressões regulares no iOS

Usar expressão regular no iOS é muito simples. Existe uma classe (NSRegularExpression) que pede no seu construtor a expressão e as opções que serão aplicadas no momento do match. Assim, caso você queira uma função para validar um campo CEP, por exemplo, pode fazer:

func validateZipCode(zipCode: String) -> Bool {
	let regex = try! NSRegularExpression(pattern: "^[0-9]{2}[0-9]{3}-[0-9]{3}$", options: [.CaseInsensitive])

	let regexResult = regex.firstMatchInString(zipCode, options:[], range: NSMakeRange(0, utf16.count)) != nil

	if !regexResult {
		return false
	}

	return true
}

Uma dica para você praticar é o site Regex Pal. Nele, é possível definir uma string e testar as suas expressões à vontade.

Se quiser, crie uma expressão para o exemplo dado na primeira seção do artigo e deixe nos comentários. Só não vale ler os comentários anteriores ;).

É carioca daqueles que falam xêro, bixcoitu e caô. É desenvolvedor iOS desde 2012 e faz parte do time mobile da OLXBrasil. Acredita que Objective-C é amor e Swift é paixão. Pra ele, o equinociOS é mais uma forma de retribuir para a comunidade tudo o que ele aprendeu pela comunidade.

Ver perfil