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
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: ^^^^^^^
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: ^^^^^ ^^^^^
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: ^ ^ ^
Com os conjuntos [ ]
dizemos a regex que uma determinada casa pode ter diversos valores para dar match.
pattern: /[em²]/gi
string: E = mc²
matches: ^ ^ ^
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: ^ ^ ^
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: ^ ^ ^ ^ ^ ^ ^
( )
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>...) . |
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: ^ ^ ^^
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 |
Tag | Nome | Função |
---|---|---|
^ | circunflexo | inicio da linha |
$ | cifrao | fim da linha |
\b | borda | inicio ou fim de palavra |
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 . |
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 |
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}))
^[^\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