Skip to content

Instantly share code, notes, and snippets.

@luan03
Last active January 26, 2016 01:18
Show Gist options
  • Save luan03/6352810 to your computer and use it in GitHub Desktop.
Save luan03/6352810 to your computer and use it in GitHub Desktop.
padrão basico de regex

Leia a ER átomo por átomo, da esquerda para a direita.

fala[r!]?

Um f seguido de um a, seguido de um l, seguido de um a, seguido de: ou r, ou !, ambos opcionais.

resultado = fala[r!]? falar, fala!, fala

curinga .* Teremos qualquer caractere, em qualquer quantidade. uma carta para se usar em qualquer situação.

Expressões são Case Sensitive

[0123456789] é igual a [0-9]

Não use o intervalo A-z, prefira A-Za-z

Linhas que tenham entre 20 e 60 caracteres:

^.{20,60}$

Expressão para casar um número de RG no formato n.nnn.nnn-n? É fácil!

[0-9]\.[0-9]{3}\.[0-9]{3}-[0-9]

Caracteres acentuados (POSIX)

Classe POSIX Similar Significado
[:upper:] [A-Z] letras maiúsculas
[:lower:] [a-z] letras minúsculas
[:alpha:] [A-Za-z] maiúsculas/minúsculas
[:alnum:] [A-Za-z0-9] letras e números
[:digit:] [0-9] números
[:xdigit:] [0-9A-Fa-f] números hexadecimais
[:punct:] [.,!?:...] sinais de pontuação
[:blank:] [ \t] espaço e TAB
[:space:] [ \t\n\r\f\v] caracteres brancos
[:cntrl:] - caracteres de controle
[:graph:] [^ \t\n\r\f\v] caracteres imprimíveis
[:print:] [^\t\n\r\f\v] imprimíveis e o espaço

Para dizer maiúsculas, fica [[:upper:]], ou seja um [:upper:] dentro de uma lista []

O [[:upper:]] é uma classe POSIX dentro de uma lista.

POSIX levam em conta a localidade do sistema. ou seja (acentuação está disponível).

Nos Estados Unidos, [[:upper:]] é igual a [A-Z].
No Brasil, [[:upper:]] é igual [A-ZÁÃÂÀÉÊÍÓÕÔÚÇ...]

ERs que procurarão em textos em português, prefira [:alpha:] em vez de A-Za-z, sempre.

Meta Mnemônico
. Ponto
[] Lista
[^] Lista negada
? Opcional
* Asterisco
+ Mais
{} Chaves
^ Circunflexo
$ Cifrão
\b Borda
\ Escape
| ou
() Grupo
\1 Retrovisor

Representantes

Meta Mnemônico Função
. Ponto Um caractere qualquer
[...] Lista Lista de caracteres permitidos
[^...] Lista negada Lista de caracteres proibidos

São metacaracteres cuja função é representar um ou mais caracteres.

Também podem ser encarados como apelidos, links, ou qualquer outra coisa que lhe lembre essa associação entre elementos.

Todos os metacaracteres deste tipo casam a posição de um único caractere, e não mais que um.

.

ponto casa com qualquer coisa
  • n.o - não, nao, ...
  • .eclado - teclado, Teclado, ...
  • e.tendido - estendido, extendido, eztendido, ...

[]

Para que nossa ER fique mais específica, trocamos o ponto pela lista
  • n[ãa]o - não, nao
  • [Tt]eclado - Teclado, teclado
  • e[sx]tendido - estendido, extendido

12[:. ]45 - 12:45, 12.45, 12 45

  • *lista casa com quem ela quer
  • *dentro da lista, todo mundo é normal.
  • A lista casa com quem ela conhece e tem suas próprias regras.
  • Dentro da lista, todo mundo é normal.
  • Dentro da lista, traço indica intervalo.
  • Um - literal deve ser o último item da lista.
  • Um ] literal deve ser o primeiro item da lista.
  • Os intervalos respeitam a tabela ASCII (não use A-z).
  • [:classes POSIX:] incluem acentuação, A-Z não.

[^]

Então se [0-9] são números, [^0-9] é qualquer coisa fora números. Pode ser letras, símbolos, espaço em branco, qualquer coisa, menos números.

A lista negada é exatamente igual à lista, podendo ter caracteres literais, intervalos e classes POSIX. Tudo o que se aplica a lista normal, se aplica à negada também.

A única diferença é que ela possui lógica inversa, ou seja, ela casará com qualquer coisa, fora os componentes listados.

Sempre após caracteres de pontuação como a vírgula ou o ponto, devemos ter um espaço em branco os separando do resto do texto. Então vamos procurar por qualquer coisa que não há espaço após a pontuação:

[:;,.!?][^ ] ou [[:punct:]][^ ]

Uma lista negada segue todas as regras de uma lista normal. Um ^ literal não deve ser o primeiro item da lista. [:classes POSIX:] podem ser negadas. A lista negada sempre deve casar algo.

Quantificadores

</tbody>
Meta Mnemônico Função
? opcional zero ou um
* asterisco zero, um ou mais
+ mais um ou mais
{n,m} chaves de n até m

Todos os quantificadores são gulosos

?

ER 6? significa zero ou uma ocorrência do número 6. Se tiver um 6, beleza, Se não tiver, beleza também.

O opcional é um quantificador que não esquenta a cabeça, para ele pode ter ou não a ocorrência da entidade anterior, pois ele a repete 0 ou 1 vez.

Por exemplo, a ER 6? significa zero ou uma ocorrência do número 6. Se tiver um 6, beleza, casamento efetuado.

Se não tiver, beleza também. Isso torna o 6 opcional (daí o nome), que tendo ou não, a ER casa.

Veja mais um exemplo, o plural. A ER ondas? tem a letra s marcada como opcional então ela casa onda e ondas.

Cada letra normal é um átomo da ER, então o opcional é aplicado somente ao atomo e não à palavra toda.

O opcional é opcional.


O opcional é útil para procurar palavras no singular e plural. Podemos tornar opcionais caracteres e metacaracteres. Leia a ER átomo por átomo, da esquerda para a direita. Leia a ER, entenda o todo e analise as possibilidades.

*

Em outras palavras, a entidade anterior pode aparecer em qualquer quantidade Quantificadores são gulosos.

Pode começar apenas com tex e ele irá percorrer buscando tudo que encontrar, iniciado com tex

O curinga .* é o tudo e o nada, qualquer coisa.

+

O mais tem funcionamento idêntico ao do asterisco, tudo o que vale para um, se aplica ao outro.

Sua utilidade é quando queremos no mínimo uma repetição, é um asterisco mais exigente.

Pode começar apenas com tex e ele irá percorrer buscando tudo que encontrar, iniciado com tex e tem que haver uma repeticao de tex pelomenos 1 vez

O mais repete em qualquer quantidade, pelo menos uma vez.

{n,m}

Você pode especificar um número exato, um mínimo, um máximo, ou uma faixa numérica.
  • Chaves são precisas.
  • As chaves simulam o *, o + e a ?.
  • As chaves não são o Chaves.

Âncoras

Meta Mnemônico Função
^ circunflexo Início da linha
$ cifrão Fim da linha
\b borda Início ou fim de palavra

^

Marca o começo de uma linha. Nada mais

$

Serve para procurar palavras no fim da linha.

Similar e complementar ao circunflexo, o cifrão marca o fim de uma linha e só é válido no final de uma ER. Como o exemplo anterior, [0-9]$ casa linhas que terminam com um número.

Só é especial no final da ER.
É cifrão e não dólar.

\b

  • A borda marca os limites de uma palavra.
  • O conceito "palavra" engloba letras, números e o sublinhado.
  • A borda é útil para casar palavras exatas e não parciais.

Outros

Meta Mnemônico Função
\c Escape Torna literal o caractere c
| ou ou um ou outro
(...) Grupo Delimita um grupo
\1...\9 Retrovisor Texto casado nos grupos 1...9

\

Escapando, \* é igual a [*] que é igual a um asterisco literal. Similarmente podemos escapar todos os metacaracteres já vistos:

\., \[ , \], \?, \+ , \{, \}, \^ e \$.

E para você ver como são as coisas, o escape é tão poderoso que pode escapar a si próprio! O \\ casa uma barra invertida \ literal.

O escape escapa um metacaractere, tirando seu poder.

\* = [*] = asterisco literal.

O escape escapa o escape, escapando-se a si próprio simultaneamente.

|

  • O ou indica alternativas.
  • Lista para um caractere, ou para vários.
  • O grupo multiplica o poder do ou.

()

  • Grupos servem para agrupar.
  • Grupos são muito poderosos.
  • Grupos podem conter grupos.
  • Grupos são quantificáveis.

\

  • O retrovisor só funciona se usado com o grupo.
  • O retrovisor serve para procurar palavras repetidas.
  • Numeram-se retrovisores contando os grupos da esquerda para a direita.
  • Temos no máximo 9 retrovisores por ER.

Quantificadores não-gulosos

meta mnemônico

?? opcional não-guloso *? asterisco não-guloso +? mais não-guloso {n,m}? chaves não-gulosas

não-gulosos
a.*? a
a.+? aa
a.?? a
a.{1,3}? aa

Barra-letra.

b-l POSIX equiv. mnemônico
\d [[:digit:]] dígito
\D [^[:digit:]] não-dígito
\w [[:alnum:]_] palavra
\W [^[:alnum:]_] não-palavra
\s [[:space:]] branco
\S [^[:space:]] não-branco

ER para casar o RG:

[0-9]\.[0-9]{3}\.[0-9]{3}-[0-9]

\d\.\d{3}\.\d{3}-\d

(?#comentário)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment