Expressões regulares (com exemplos) - 1

"E agora vou falar sobre expressões regulares. Este tópico é complexo e simples ao mesmo tempo. Para entender completamente as expressões regulares, você pode precisar ler dois ou três livros pesados, mas posso ensiná-lo a usá-los agora mesmo."

"Como programadores experientes gostam de brincar, se você tem um problema e pensa que vai resolvê-lo com expressões regulares, agora você tem dois problemas."

"Hum."

"Espero não ter te assustado muito, meu amigo. Não?"

"Ok, bom. Então, nosso novo tópico são expressões regulares."

"Se as simplificarmos demais, as expressões regulares são padrões para strings."

"Você pode verificar se uma string corresponde a um determinado padrão. Você também pode dividir uma string em partes usando um delimitador ou um padrão."

"Mas vamos começar com algo simples: o que é um padrão? "

"Em SQL (mas não em Java), você pode verificar se uma string corresponde a um determinado padrão. É assim que fica:"

name like 'Alex%'

Aqui o nome é uma variável, como é um comando para verificar um padrão e "Alex%" é o padrão.

Nesse caso, % significa qualquer string ou substring.

Padrão Strings correspondentes ao padrão
'Alex%' Alex
Alex andr
Alex ander
Alex andra
….
'%x%' Ma x
Ma x im
Ale x andr
'%a' Olg a
Helen a
Ir a

"No SQL, se você precisar especificar que deve haver apenas um outro caractere, use o caractere de sublinhado: "_"."

Padrão Strings correspondentes ao padrão
'Alex%_' Alex
Alex andr
Alex ander
Alex andra
….
'_x' Machado
Bx
Cx
'___' Aaa
Aab
Bbb

"Isso faz sentido."

"Ok, então vamos passar para expressões regulares."

"As expressões regulares normalmente incluem restrição não apenas no número de caracteres, mas também em seu 'conteúdo'. "Qualquer máscara geralmente consiste em duas (às vezes mais) partes: a primeira descreve as 'preferências' dos caracteres e a segunda descreve o número de caracteres ."

"Aqui estão alguns exemplos de conteúdo :"

Padrão Descrição Exemplos
. Qualquer personagem 1
\d qualquer dígito 7
\D Qualquer não dígito C
\s Um espaço, quebra de linha ou caractere de tabulação ''
\S Qualquer coisa, exceto espaços, tabulações e quebras de linha f
[az] Qualquer letra de a a z z
[0-9] Qualquer dígito de 0 a 9. 8
\c Qualquer caractere de palavra c
\C Qualquer caractere sem palavras _

"Não vou me lembrar deles de imediato, mas não parece muito difícil."

"Excelente, então aqui estão exemplos do número de caracteres em uma máscara: "

Padrão Descrição Exemplos
A? O caractere 'A' ocorre uma vez ou não ocorre A
B+ O caractere 'B' ocorre uma ou mais vezes BBB
C* O caractere 'C' ocorre zero ou mais vezes CCC
D{n} O caractere 'D' ocorre n vezes O padrão D{4} corresponde a DDDD
E{n,} O caractere 'E' ocorre n ou mais vezes O padrão E{2,} corresponde a EEEEEEE
F{n,m} O caractere 'F' ocorre entre n e m vezes O padrão E{2,4} corresponde a EEEE

"Isso tudo parece bastante simples."

"Você está pegando tudo tão rápido. Agora vamos ver como fica tudo junto:"

Padrão Descrição Exemplos
[de Anúncios]? Um caractere entre 'a' e 'd' ocorre uma vez ou não ocorre a, b, c, d
[bd,z]+ Os caracteres 'b', 'c', 'd' ou 'z' ocorrem uma ou mais vezes b, bcdcdbdbdbdbzzzzbbzbzb, zbz
[1,7-9]* Os dígitos 1, 7, 8 ou 9 ocorrem zero ou mais vezes 1, 7, 9, 9777, 111199
1{5} O dígito 1 ocorre 5 vezes 11111
[1,2,a,b]{2} Os símbolos 1, 2, 'a' ou 'b' ocorrem duas vezes 11, 12, 1a, ab, 2b, bb, 22
[a,0]{2,3} Os símbolos 'a' ou 0 ocorrem 2 ou 3 vezes aa, a0,00,0a, aaa,000, a00,0a0, a0a

"Ainda tudo limpo."

"Sério? Hmm. Ou eu expliquei tudo muito bem ou você é muito rápido na compreensão. Bem, de qualquer forma, isso é bom para nós."

"Aqui estão alguns novos insights para você."

"Como as expressões regulares costumam ser usadas para localizar substrings, podemos adicionar mais dois caracteres (^ e $) aos nossos padrões."

"^ significa que a substring deve incluir o início da string."

"$ significa que a substring deve incluir o final da string."

"Aqui estão alguns exemplos:"

Padrão String e substrings que correspondem ao padrão
um{3} aa  a  aa  a  aa
um{3}$ aa a aa a  aa
^a{3} aa  a aa a aa
^a{3}$ aa a aa a aa

"E mais um ponto importante."

"Em expressões regulares, os seguintes caracteres têm um significado especial: [ ] \ / ^ $ . | ? * + ( ) { }. Eles são chamados de caracteres de controle. Portanto, você não pode simplesmente usá-los em strings."

"Como no código Java, eles devem ter escape. "E, novamente, como no código Java, o caractere '\' é usado para isso."

"Se quisermos descrever uma string composta por três '?' caracteres, não podemos escrever '?{3}', porque '?' é um caractere de controle. Precisamos fazer assim: \?{3}. Se quisermos usar um caractere '\', então precisamos escrever '\\'."

"OK, entendi."

"E aqui está outro detalhe interessante. Em arquivos com código Java, o caractere '\' também deve ter escape em strings, já que é um caractere de controle."

"Claro."

"Portanto, se você está tentando definir uma expressão regular Java em uma string, precisa escapar do caractere '\' duas vezes."

"Aqui está um exemplo:"

Eu quero uma máscara que corresponda a 'c:\anything'
Em teoria, a expressão regular deve ter esta aparência:
um caractere 'c',
dois pontos,
barra invertida,
ponto e asterisco (para denotar qualquer número de caracteres). Eu adicionei espaços para melhorar a legibilidade:
c : \ .*
Mas os caracteres '\' e '.' precisam ter escape, então a expressão regular ficará assim:
c :   \\ \. *
Ou, sem espaços
c: \\ \. *
"Devemos ter três barras invertidas em nossa expressão regular.
Isso significa que em um arquivo Java a expressão regular ficará assim:"
String regexp = "c: \\\\ \\. *";

"Uau! Uau. Agora eu sei."

"E se você decidir se aprofundar nisso, aqui estão alguns bons links:"

Lição sobre a Wikipédia