Skip to content

Instantly share code, notes, and snippets.

@GiovaniPM
Last active April 29, 2021 20:46
Show Gist options
  • Save GiovaniPM/04efc466d19ccc8d112d036c48de4a5c to your computer and use it in GitHub Desktop.
Save GiovaniPM/04efc466d19ccc8d112d036c48de4a5c to your computer and use it in GitHub Desktop.
Regular Expression

Regular Expression

Conceito

Uma expressão regular é um método formal de se especificar um padrão de texto.

Aplicações:

  • procura;
  • substituição;
  • validação de formatos;
  • filtragem de informações

Pattern

Sequência de caracteres a ser usada como expressão regular.

pattern: /a/
origem:  A casa está limpa.
matches:    ^
pattern: /celular/
origem:  O celular está tocando.
matches:   ^^^^^^^

Flags

Define comportamentos adiconais ao interpretador de expressão regular.

Flag Descrição
g achar todas as ocorrências da regex
i ignora case sensitive
m multilinha, lida com caracteres de inicio e fim (^ e $) ao operar em múltiplas linhas.
x ignora espaços em branco
s linha única
pattern: /ontem/gi
string:  Ontem faltou água, Anteontem faltou luz
matches: ^^^^^                  ^^^^^

Operadores

Ou

Algumas vezes precisamos dar match em mais de um termo, para isso usamos o operador pipe | .

pattern: /ver|distrai/gi
string:  Ver a linha do horizonte me distrai
matches: ^^^                         ^^^^^^^

pattern: /20|nove/gi
string:  Perdi 20 em 20 e nove amizades
matches:       ^^    ^^   ^^^^

pattern: /e|m|²/gi
string:  E = mc²
matches: ^   ^ ^

Conjunto

Com os conjuntos [ ] dizemos a regex que uma determinada casa pode ter diversos valores para dar match.

pattern: /[em²]/gi
string:  E = mc²
matches: ^   ^ ^

Subconjunto

Uma funcionalidade interessante é de adicionar range (invervalos) dentro dos nossos conjuntos. Podemos determinar um conjunto de match em letras que vão de A à Z ou pegue qualquer digito (0 à 9).

pattern: /[a-z]/
string:  João de Santo Cristo
matches:  ^ ^ ^^  ^^^^  ^^^^^

pattern: /[A-Za-z]/
string:  Açucar e Café
matches: ^ ^^^^ ^ ^^^

pattern: /[0-9.,]/
string:  Um ps4 custa R$ 1.600,00
matches:      ^          ^^^^^^^^

Um detalhe a ser observado é que o range obedece a mesma ordem da tabela Unicode, sendo assim regex como [a-Z] ou [4-1] produziram erro, pois ambas não estão na ordem correta da tabela Unicode. Podemos também dar match em letras com acentos (é-à) ou (ç) usando:

pattern: /[À-ü]/
string:  Açaí é melhor
matches:  ^ ^ ^

Fora do conjunto

Temos também os conjuntos negados, que como o nome sugere, dar match em tudo que não faça parte do conjunto. Para definí-lo iniciamos a regra do conjunto com ^ , por exemplo [^a-z] que aceita tudo que não seja entre a à z. Vejamos um exemplo

pattern: /[^aeiouí]/gi
string:  Paralelepípedo
matches: ^ ^ ^ ^ ^ ^ ^

Conjunto

( ) eles nos possibilita a criação de regras isoladas, possibilita a criação de referencias (retrovisores) para o reuso da mesma regra em outro local dentro de uma mesmo regex e ainda cria a possibilidade de validações dentro da regex.

pattern: /(\d{2})\/?(\d{2})?\/(\d{4})/
string:  Hoje é dia 20/01/2020
matches:            ^^^^^^^^^^

pattern: /\d{2}(\/?)\d{2}?\1\d{4}/g
string:  20/01/2020 25091991 25-09/2000
matches: ^^^^^^^^^^ ^^^^^^^^
Tag Exemplo Descrição
(?:...) /match this (?:match that)/g Um grupo de não captura permite que você aplique quantificadores a parte de sua regex, mas não captura / atribui um ID.
(...) /match and (capture )+/g Isola parte da correspondência completa para ser posteriormente referida pelo ID na regex ou na matriz de correspondências. IDs começam em 1. Um equívoco comum é que a repetição de um grupo de captura criaria IDs separados para cada vez que ele corresponder. Se essa funcionalidade for necessária, deve-se confiar no sinalizador global (/ g).
(?>...) /(?>.+)@/ Corresponde à substring mais longa possível no grupo e não permite retrocesso posterior para reavaliar o grupo. Não é um grupo de captura.
(?|...) /(?|(candy)|(kiss)|(berry))/g Não permite que o ID do grupo de captura seja incrementado para todos os grupos de captura incluídos.
(?#...) /Not(?# .* <-- that should match all)/ Qualquer texto que apareça neste grupo é ignorado na regex. Outra opção é habilitar o sinalizador x para permitir # comentários, mas também fará com que o mecanismo regex ignore os caracteres de espaço.
(?'name'...) /(?'name'Sally)/ Este grupo de captura pode ser referido usando o nome dado em vez de um número. Notação alternativa para (?<name>...) ou (?P<name>...).

Metacaracteres

Tag Descrição
. funciona como um coringa, sendo capaz de dar match em qualquer caractere
- usado em uma regra de conjunto com range [1-9]
^ negação
\ escape para a utilização de metacaracter como caracter. Obs.: também é usado como shorthand.
pattern: /cas./gi
string:  Casa, caso, case
matches: ^^^^  ^^^^  ^^^^ 

pattern: /[a\-o]/gi
string:  cachorro-quente.
matches:  ^  ^  ^^

Quantificadores

Tag Nome Função
? opcional zero ou um
* asterisco zero ou mais
+ mais um ou mais
{n, m} chaves de n até m
?? opcional 0 ou 1 casa o mínimo possível
*? asterisco 0 ou mais casa o mínimo possível
+? mais 1 ou mais casa o mínimo possível
{n, m}? chaves numérico casa o mínimo possível

Âncoras

Tag Nome Função
^ circunflexo inicio da linha
$ cifrao fim da linha
\b borda inicio ou fim de palavra

Shorthand

Caractere Descrição
\0 Corresponde a um caractere de nulo
\a Corresponde a um caractere de sino (alarme), \u0007.
\A Corresponde somente ao início de uma sequência.
\b Em uma [ ] classe de caractere character_group, corresponde a um backspace, \u0008 . (Consulte classes de caractere.) Fora de uma classe de caractere, \b é uma âncora que corresponde a um limite de palavra. (Confira Âncoras).
\B Corresponde a um limite.
\c torna literal o caractere c
\d Corresponde a um caractere de dígito.
\D Corresponde a um caractere diferente de dígito.
\e Corresponde a um escape, \u001B.
\f Corresponde a um avanço de página, \u000C.
\n Corresponde a uma nova linha, \u000A.
\r Corresponde a um retorno de carro, \u000D. Observe que \r não é equivalente ao caractere de nova linha, \n.
\s Corresponde a qualquer espaço em branco, incluindo espaços, tabulações, caracteres de alimentação de formulário, e assim por diante.
\S Corresponde a qualquer caractere diferente de espaço em branco.
\t Corresponde a uma tabulação, \u0009.
\v Corresponde a uma tabulação vertical, \u000B.
\w Corresponde a qualquer caractere de texto, incluindo sublinhado. Essa expressão é equivalente a [A-Za-z0-9_].
\W Corresponde a qualquer caractere diferente de palavra. Essa expressão é equivalente a [^A-Za-z0-9_].
\z Corresponde somente ao fim de uma sequência.
\Z Corresponder somente ao fim de uma sequência ou antes de um caractere de nova linha no final.
\nnn Corresponde a um caractere ASCII, em que nnn consiste em dois ou três dígitos que representam o código de caractere octal. Por exemplo, \040 representa um caractere de espaço. Esse constructo é interpretado como referência inversa se tiver apenas um dígito (por exemplo, \2) ou se corresponder ao número de um grupo de captura. (Confira Constructos de referência inversa).
\x nn Corresponde a um caractere ASCII, em que nn é um código de caractere hexadecimal com dois dígitos.
\cX Corresponde a um caractere de controle ASCII, em que X é a letra do caractere de controle. Por exemplo, \cC é CTRL-C.
\u nnnn Corresponde a uma unidade de código UTF-16 cujo valor é nnnn hexadecimal. Observação: O caractere de escape do Perl 5 que é usado para especificar o Unicode não tem suporte do .NET. O escape de caractere do Perl 5 tem o formulário \x{ #### …} , em que #### … é uma série de dígitos hexadecimais. Em vez disso, use \unnnn.
\ Quando seguido por um caractere que não é reconhecido como um caractere com escape, corresponde a esse caractere. Por exemplo, * corresponde a um asterisco (*) e é igual a \x2A.

POSIX

Tag ASCII Função
[[:alnum:]] [a-zA-Z0-9] caracteres alfanumericos
[[:alpha:]] [a-zA-Z] Caracteres alfabéticos
[[:ascii:]] [\x00-\x7F] Caracteres ASCII
[[:blank:]] [\s\t] espaço e tab
[[:cntrl:]] [\x00-\x1F\x7F] Caracteres de controle
[[:digit:]] [0-9] digitos
[[:graph:]] [\x21-\x7E] Caracteres visíveis (qualquer coisa, exceto espaços e caracteres de controle)
[[:lower:]] [a-z] Letras minúsculas
[[:print:]] [\x20-\x7E] Caracteres e espaços visíveis (qualquer coisa, exceto caracteres de controle)
[[:punct:]] [!"#$%&'()*+,-./:;<=>?@[\]^_{|}~] pontuação
[[:space:]] [ \t\r\n\v\f] Todos os caracteres de espaço em branco, incluindo quebras de linha
[[:upper:]] [A-Z] Letras maiúsculas
[[:word:]] [A-Za-z0-9_] Caracteres do Word (letras, números e sublinhados)
[[:xdigit:]] [A-Fa-f0-9] Dígitos hexadecimais

Exemplos

Nome pdf com hifen

^(\w*)(-\w*)*\.pdf

Data

^(0[1-9]|[12][0-9]|3[01])[-\/\.](0[1-9]|1[012])[-\/\.]((19|20)\d{2})

Hora

^([01]?\d|2[0-3]):([0-5][0-9])

YYY-MM-DD[T]HH:MM:SS

^(?<year>[\d]{4})-(?<month>0[1-9]|1[1-2])-(?<day>0[1-9]|[1-2][0-9]|3[0-1])T(?<hour>[0-1][0-9]|2[0-3]):(?<minute>[0-5][0-9]):(?<second>[0-5][0-9])(?:Z|.(?<millisecond>[0-9]{2,3}))

Email

^[^\s@]+@[^\s@]+\.[^\s@]+$

IP4

^(?:(?:25[0-5]|2[0-4]\d|1?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|1?\d\d?)$

URL

^([a-z]+):\/\/([^\/]+)\/?([^:]+):?(\d+)?$

Biblia

(?<book>\S+)\s*(?<chapters>(?<from>[0-9]+)(\s*-\s*(?<to>[0-9]+))*)

Url

(?<protocol>(?:https?:\/\/?)+(?:www(?!.))?)?(?<tdl>[a-zA-Z0-9@:._-]{2,256}\.[a-z0-9]{2,6}(?:[:0-9]{1,5})?)(?<path>(?:\/)[-a-zA-Z0-9\/_]+)?(?<params>[-a-zA-Z0-9?%#+()=&]+)?

CEP

^(\d{2}\.\d{3}\-\d{3}|\d{8})

Hifen

\040*(\-|_|\.)\040*

Phone

(\040*\(\040*){0,1}(\d{2})(\040*\)){0,1}(\040*\-\040*|\040*\.\040*|\040*)(\d{0,1})(\040*\-\040*|\040*\.\040*|\040*)(\d{4})(\040*\-\040*|\040*\.\040*|\040*)(\d{4})(\040*)

YAPhone

/(\040*[[:punct:]]*\040*)(\d{2})(\040*[[:punct:]]*)(\040*[[:punct:]]*\040*)(\d{0,1})(\040*[[:punct:]]*\040*)(\d{4})(\040*[[:punct:]]*\040*)(\d{4})(\040*)/ig

Links

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