Magic Quadrant™ para gerenciamento de acesso privilegiado 2025: Netwrix reconhecida pelo quarto ano consecutivo. Baixe o relatório.

Plataforma
Centro de recursosBlog
Expressões Regulares para Iniciantes: Como Começar a Descobrir Dados Sensíveis

Expressões Regulares para Iniciantes: Como Começar a Descobrir Dados Sensíveis

May 29, 2019

Qualquer solução de descoberta e classificação de dados depende fortemente de expressões regulares (às vezes chamadas de RegExes, REs ou padrões RegEx) para identificar dados sensíveis. Mas o que são RegExes e como podem ser usadas para descobrir dados sensíveis? Vamos descobrir.

As expressões regulares são uma pequena, mas altamente especializada linguagem de programação; basicamente, são curingas turbinados. Utilizando essa pequena linguagem, você especifica regras que definem as sequências de caracteres que deseja encontrar. Por exemplo, pode definir uma RegEx que irá corresponder a endereços de e-mail, PII, PHI ou números de cartões de crédito.

Componentes de Regex

Uma RegEx pode incluir literais e metacaracteres.

Literais

Qualquer caractere único, exceto aqueles reservados como metacaracteres, já é uma expressão regular por si só. Por exemplo, www corresponde a www.Netwrix.com mas wwz não corresponde. Observe que as expressões regulares são sensíveis a maiúsculas e minúsculas, então www não corresponderá a WWW nem a wWw.

Metacaracteres

Os seguintes caracteres únicos não são interpretados literalmente, mas têm significados especiais:

  • . ^ $ * + ? { } [ ] | ( )

A tabela a seguir descreve como cada um desses metacaracteres funciona.

Tipo

Meta-caracteres

Descrição

Exemplos

O ponto

.

O ponto significa qualquer caractere.

net.rix corresponderá tanto a www.netwrix.com quanto a www.netfrix.com.

Classe de personagem

[]

Correspondências para qualquer coisa dentro dos colchetes.
A única exceção é o caractere ^. Dentro de uma classe, no início, o ^ significa exceção da pesquisa. Por exemplo, [^n] corresponderá a qualquer caractere exceto n; isso é chamado de classe de caracteres negados.
Note que metacaracteres (com uma exceção) não são ativos dentro de classes. Por exemplo, [net$] corresponderá a qualquer um dos caracteres n, e, t ou $ ($ é um metacaractere, mas dentro de uma classe de caracteres corresponde apenas ao $).
A única exceção é o caractere ^. Dentro de uma classe, no início, o ^ significa exceção da pesquisa. Por exemplo, [^n] corresponderá a qualquer caractere exceto n; isso é chamado de classe de caracteres negados.

Você pode listar caracteres individualmente; por exemplo, Netwrix corresponderá a netw , netr e netx mas não a netz.
Ou você pode procurar por um intervalo de caracteres fornecendo dois caracteres e separando-os por um hífen; por exemplo, net[a-z] corresponderá a neta, netw e netf mas não a net1.

Âncoras

^

Usado para corresponder a caracteres no início de uma string

^https corresponderá a https://netwrix.com mas não a www.netwrix.com ou http://netwrix.com

$

Usado para corresponder a caracteres no final de uma string

com$ corresponderá a www.netwrix.com ou telecom mas não a computer.

Iteração / quantificadores

?

Corresponde ao elemento anterior zero ou uma vez (sempre corresponderá se o caractere não for encontrado). É ótimo para encontrar caracteres opcionais.

cor corresponderá tanto a color quanto a colour.

*

Corresponde ao elemento anterior zero ou mais vezes em vez de zero ou uma vez. É ótimo para encontrar séries opcionais de caracteres.

ne*t corresponderá a nt (zero caracteres e), net (um caractere e), neeet (três caracteres e), e assim por diante.

+

Corresponde ao elemento anterior uma ou mais vezes.
Tenha atenção especial à diferença entre * e +. * corresponde a zero ou mais vezes, então o que está sendo repetido pode não estar presente de todo; + exige pelo menos uma ocorrência.

ne+t corresponderá a net e neeet mas não a nt.

|

O operador de escolha corresponde à expressão antes ou à expressão depois do operador.

Netwrix corresponderá a Netwrix e Netwrix.

{}

{x} corresponde se o elemento que o precede for encontrado exatamente x vezes.
{x,y} corresponde se o elemento anterior for encontrado pelo menos x vezes, mas não mais do que y vezes.

n{3} corresponderá a nnn, nnnn e nnnd (porque todos incluem n três vezes seguidas), mas não corresponderá a nnw.
9{3} corresponderá a 999, 1234999124 e text999text, mas não a 84299238, 9909, ou page992.
n{3,5} corresponderá a nnn, nnnn e nnnnn.

Bloqueando e capturando

()

Define uma subexpressão que pode ser recuperada mais tarde usando uma abreviação: A primeira subexpressão entre parênteses pode ser recuperada por \1, a segunda pode ser recuperada por \2 e assim por diante.
Parênteses são normalmente usados ou com | (o operador de escolha) no interior ou com quantificadores no exterior.

Gr(a|e)y will match Gray or Grey.
[0-9]([-])[0-9]\1[0-9] will match 3-4-2 and 4-6-1, but not 1-23, 42-1 or 234.

Sequência de escape

\

O metacaractere que segue a barra será usado como literal.
Note que algumas sequências que começam com \ não são sequências de escape. Em vez disso, representam conjuntos predefinidos de caracteres que são frequentemente úteis, como o conjunto de dígitos, o conjunto de letras ou o conjunto de tudo que não é espaço em branco. Os mais populares estão listados abaixo como “metacaracteres especiais.”

www\.netwrix\.com corresponderá a www.netwrix.com mas não a www,netwrix,com.

Caracteres especiais metacharacters

\s

Corresponde a qualquer caractere de espaço em branco (um espaço, uma tabulação, uma quebra de linha ou um avanço de formulário).

Netwrix Auditor corresponderá a Netwrix Auditor, e Netwrix Auditor, mas não a Netwrix Auditor ou NetwrixAuditor.

\S

Corresponde a qualquer caractere que não seja espaço em branco.

Netwrix corresponderá a Netwrix e a Netwrix.

\w

Corresponde a qualquer caractere alfanumérico.

\w\w\w corresponderá a net, dfw e Netwrix.

\W

Corresponde a qualquer caractere não alfanumérico.

Netwrix\W corresponderá a Netwrix! e Netwrix?.

\d

Corresponde a qualquer dígito decimal.

Netwrix\d\d corresponderá a Netwrix80 e Netwrix90.

\D

Corresponde a qualquer caractere que não seja um dígito.

Netwrix\D corresponderá a Netwrix) e Netwrix-.

\a

Corresponde a qualquer caractere alfabético único, seja maiúsculo ou minúsculo.

Netwrix corresponderá a Netwrix, netfrix e netarix.

\b

Define um limite de palavra.

\brix corresponderá a rix e rixon mas não a Netwrix.

\B

Define um limite que não é de palavra

\Brix corresponderá a Netwrix e trix mas não a rixon.

Combinações de metacaracteres

Agora nós conhecemos quase todos os metacaracteres e estamos prontos para combiná-los.

Exemplo: Procurando por números de placas de veículos

Suponha que precisamos encontrar um número de licença no formato aaa-nnnn — os três primeiros dígitos devem ser alfanuméricos e os últimos quatro devem ser numéricos. O hífen pode ser substituído por qualquer caractere ou estar completamente ausente.

A expressão regular para isso será:

  • b[0-9A-Z]{3}([^ 0-9A-Z]|s)?[0-9]{4}b

Vamos dissecar esta RegEx:

  • b exige um limite de palavra, portanto, as strings correspondentes não podem ser parte de uma string maior.
  • [0-9A-Z]{3} significa que os três primeiros caracteres devem ser alfanuméricos.
  • ([^ 0-9A-Z]|s)? significa que a próxima parte da string deve ser um delimitador — um caractere não alfanumérico ou um espaço em branco — ou nada.
  • [0-9]{4} significa que a próxima parte da string deve ter 4 dígitos.
  • b especifica outro limite de palavra.

Esta RegEx corresponderá aos seguintes números de licença: NT5-6345, GH3 9452, XS83289

No entanto, não corresponderá a estes números de licença: ZNT49371, HG3-29347, nt4-9371

Exemplo: Procurando por números de Seguro Social

Outro bom exemplo é o número do Seguro Social dos EUA (SSN), que sempre segue o formato nnn-nn-nnnn.

A RegEx mais fácil é a seguinte:

  • [0-9]{3}-[0-9]{2}-[0-9]{4}

No entanto, isso gerará falsos positivos, já que nem todos os números que têm essa forma são SSNs legítimos. Além disso, deixará de identificar alguns SSNs reais, incluindo aqueles que são escritos sem os hífens. Para obter resultados mais precisos, devemos construir um mais complexo. Sabemos que:

  • Nenhum grupo de dígitos pode ser composto inteiramente por zeros.
  • O primeiro bloco não pode ser 666 ou 900-999.
  • Os números de Segurança Social podem ser escritos com caracteres de espaço em branco em vez de hífens, ou sem nenhum delimitador.
  • Se o primeiro bloco começar com um 7, deve ser seguido por um número entre 0 e 6 e depois qualquer terceiro dígito.

Portanto, a RegEx avançada será assim:

  • b(?!000|666|9d{2})([0-8]d{2}|7([0-6]d))([-]?|s{1})(?!00)dd2(?!0000)d{4}b

Como antes, b no início e no final especificam um limite de palavra. Vamos olhar mais profundamente em cada bloco de números entre eles.

O primeiro bloco

  • (?!000|666|9d{2}) é um look-ahead negativo que especifica que o número não deve começar com 000, 666, ou 9 seguido por quaisquer dois dígitos.
  • ([0-8]d{2} especifica que a string deve começar com um dígito entre 0 e 8 e ter mais dois dígitos (0-9) após isso.
  • |7[0-6]d)) diz que para começar com 7, o próximo dígito deve estar entre 0 e 6, seguido por qualquer dígito.
  • ([-]?|s{1}) especifica que após os três dígitos, deve haver um hífen, um caractere de espaço em branco ou nada, para indicar o final do primeiro bloco.

O segundo bloco

  • (?!00) é outro look-ahead negativo que especifica que não deve haver 00 no segundo bloco.
  • dd especifica que deve haver quaisquer dois dígitos no segundo bloco.
  • 2 corresponde ao mesmo texto que o segundo grupo de captura, que é ([-]?|s{1}), portanto, especifica que o segundo bloco pode terminar com um hífen, um caractere de espaço em branco ou nenhum caractere adicional.

O terceiro bloco

  • (?!0000) é outro look-ahead negativo que especifica que não podem haver quatro zeros no terceiro bloco.
  • d{4} exige quatro dígitos no terceiro bloco do SSN.

Exemplos de RegExes populares

Para encontrar

Use esta RegEx

Exemplo de correspondência

Endereços de email

^[\w\.=-]+@[\w\.-]+\.[\w]{2,3}$

T.Simpson@netwrix.com

Números de Segurança Social dos EUA

\b(?!000|666|9\d{2})([0-8]\d{2}|7([0-6]\d))([-]?|\s{1})(?!00)\d\d\2(?!0000)\d{4}\b

513-84-7329

Endereços IPV4

^\d{1,3}[.]\d{1,3}[.]\d{1,3}[.]\d{1,3}$

192.168.1.1

Datas no formato MM/DD/AAAA

^([1][12]|[0]?[1-9])[\/-]([3][01]|[12]\d|[0]?[1-9])[\/-](\d{4}|\d{2})$

05/05/2018

Números do MasterCard

^(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}$

5258704108753590

Números de cartão Visa

\b([4]\d{3}[\s]\d{4}[\s]\d{4}[\s]\d{4}|[4]\d{3}[-]\d{4}[-]\d{4}[-]
\d{4}|[4]\d{3}[.]\d{4}[.]\d{4}[.]\d{4}|[4]\d{3}\d{4}\d{4}\d{4})\b

4563-7568-5698-4587

Números de cartão American Express

^3[47][0-9]{13}$

34583547858682157

Códigos ZIP dos EUA

^((\d{5}-\d{4})|(\d{5})|([A-Z]\d[A-Z]\s\d[A-Z]\d))$

97589

Caminhos de arquivo

\\[^\\]+$

\\fs1\shared

URLs

(?i)\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+
|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))

www.netwrix.com

Recursos úteis da web sobre Regex

Compartilhar em

Saiba Mais

Sobre o autor

Asset Not Found

Jeff Melnick

Diretor de Engenharia de Sistemas

Jeff é um ex-Diretor de Engenharia de Soluções Globais na Netwrix. Ele é um blogueiro, palestrante e apresentador da Netwrix há muito tempo. No blog da Netwrix, Jeff compartilha lifehacks, dicas e truques que podem melhorar drasticamente sua experiência em administração de sistemas.