Diego Ventura (@venturadiego) é 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.
O que são expressões regulares
Expressão regular, vulgo regex, é um padrão de caracter 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 a 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 caracter e sua funcionalidade, separados por grupos.
Especificadores
Especificam (daí o nome) um conjunto de caracteres a partir de uma posição.
Metacaracter | Funcionalidade |
---|---|
. |
Qualquer caracter |
... |
Qualquer caracter incluído no conjunto |
^... |
Qualquer caracter não incluído no conjunto |
\d |
Qualquer caracter que seja um número (o mesmo que [0-9] ) |
\D |
Qualquer caracter que não seja um número (o mesmo que [^0-9] ) |
s |
Qualquer caracter branco (espaços, quebra de linha, tabs) |
S |
Qualquer caracter não branco |
w |
Qualquer caracter alfa numérico |
W |
Qualquer caracter não alfa numérico |
\ |
Ignora o significado do próximo caracter na expressão. Ex.: Se quiser representar um . (ponto final), você utiliza \. . Dessa forma o . não vai representar qualquer caracter |
Quantificadores
Definem o número de repetições permitidas pela expressão anterior
Metacaracter | 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.
Metacaracter | Funcionalidade |
---|---|
^ |
Define a posição do início do texto ou de uma nova linha (em caso de textos multi-linhas) |
\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 multi-linhas) |
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
Metacaracter | 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 caracter 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}
.
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 ;)