Olá Pessoal, tudo bom?
No artigo de hoje iremos começar a explicar algumas expressões regulares úteis para o dia a dia, no caso a trabalhar com números e letras. Veja na continuação desse artigo.
Expressões Regulares
Uma das coisas que, independente da linguagem de programação, poucos desenvolvedores dominam são as expressões regulares. O formato dessas expressões indica uma forma de encontrar um determinado padrão de caracteres (pattern) dentro de uma String. Esse formato pode ser muito simples ou extremamente complexo, dependendo do que está sendo usado para compor essa expressão.
A composição desse formato é estabelecida por três categorias:
- Meta-Caracteres
- Intervalos e Simbolos reservados
- Quantificadores
Ainda assim, é possível usar apenas uma dessas categorias e uma expressão regular estará construída. Para maiores detalhes de todas as expressões que existem isoladamente no Java veja a API da classe Pattern ((API da classe Pattern – link))
Nesse artigo o foco da expressão regular será sobre uma String de tamanho 1, indicando se a String possui letras ou números. Veja na tabela abaixo:
Expressão Regular | O que significa? |
\\d | Um Número |
\\D | Qualquer coisa MENOS Número |
\\w | Uma Letra ou Número |
\\W | Qualquer coisa MENOS letra ou número |
Agora vamos exemplificar alguns testes somente com Meta-Caracteres. Suponha a classe de teste JUnit abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
package br.com.mauda.expressoes.regulares; import org.junit.Assert; import org.junit.Test; public class PatternsTeste { @Test public void somenteNumeroStringTamanho1() { String stringASerValidada = "A"; String pattern = "\\d"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "1"; Assert.assertTrue(stringASerValidada.matches(pattern)); stringASerValidada = ","; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "12"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "1A"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "AB"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "A2"; Assert.assertFalse(stringASerValidada.matches(pattern)); } @Test public void semNumeroStringTamanho1() { String stringASerValidada = "A"; String pattern = "\\D"; Assert.assertTrue(stringASerValidada.matches(pattern)); stringASerValidada = "1"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = ","; Assert.assertTrue(stringASerValidada.matches(pattern)); stringASerValidada = "12"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "1A"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "AB"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "A2"; Assert.assertFalse(stringASerValidada.matches(pattern)); } @Test public void somenteLetraOuNumeroStringTamanho1() { String stringASerValidada = "A"; String pattern = "\\w"; Assert.assertTrue(stringASerValidada.matches(pattern)); stringASerValidada = "1"; Assert.assertTrue(stringASerValidada.matches(pattern)); stringASerValidada = ","; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "12"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "1A"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "AB"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "A2"; Assert.assertFalse(stringASerValidada.matches(pattern)); } @Test public void semLetraOuNumeroStringTamanho1() { String stringASerValidada = "A"; String pattern = "\\W"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "1"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = ","; Assert.assertTrue(stringASerValidada.matches(pattern)); stringASerValidada = "12"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "1A"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "AB"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "A2"; Assert.assertFalse(stringASerValidada.matches(pattern)); } } |
Vamos agora explicar cada método de teste e seus resultados:
método de teste somenteNumeroStringTamanho1()
Esse método possui a premissa de testar uma String, cujo tamanho é 1 e contenha somente números. Assim um exemplo prático é uma String que represente um número de 0 a 9. Assim o único resultado verdadeiro será um número. Strings com tamanho maior que 1 terão resultado falso assim como qualquer outro elemento não sendo um número.
método de teste semNumeroStringTamanho1()
Esse método possui a premissa de testar uma String, cujo tamanho é 1 e não contenha números. Assim um exemplo prático é uma String que represente uma letra de a-z ou A-Z ou mesmo um caractere especial, como uma “,”. Assim no nosso método de teste existem dois resultados verdadeiros, a letra “A” e a virgula “,”. Strings com tamanho maior que 1 terão resultado falso assim como números.
método de teste somenteLetraOuNumeroStringTamanho1()
Esse método possui a premissa de testar uma String, cujo tamanho é 1 e contenha somente números ou letras. Assim um exemplo prático é uma String que represente uma letra de a-z ou A-Z ou um número de 0 a 9. Assim no nosso método de teste existem dois resultados verdadeiros, a letra “A” e o número “1”. Strings com tamanho maior que 1 terão resultado falso assim como caracteres especiais.
método de teste semLetraOuNumeroStringTamanho1()
Esse método possui a premissa de testar uma String, cujo tamanho é 1 e não contenha números ou letras. Assim um exemplo prático é uma String que represente um caractere especial, como uma “,”. Assim o único resultado verdadeiro será a virgula “,”. Strings com tamanho maior que 1 terão resultado falso assim como letras e números.
Adicionando o quantificador *
Se adicionar o quantificador * as expressões como ficaria nossos resultados? Vamos primeiro modificar nossa tabela:
Expressão Regular | O que significa? |
\\d* | Uma String formada apenas por números |
\\D* | Uma String formada por qualquer coisa MENOS Número |
\\w* | Uma String formada apenas por letras ou Números |
\\W* | Uma String formada por qualquer coisa MENOS letras ou números |
Entendeu para que serve o quantificador *. Ele indica zero ou mais repetições de um determinado padrão na String a ser avaliada. Agora vamos exemplificar alguns testes somente com Meta-Caracteres. Vamos modificar a classe de teste JUnit abaixo com as novas expressões:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
package br.com.mauda.expressoes.regulares; import org.junit.Assert; import org.junit.Test; public class PatternsTeste { @Test public void somenteNumeroStringTamanho1() { String stringASerValidada = "A"; String pattern = "\\d*"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "1"; Assert.assertTrue(stringASerValidada.matches(pattern)); stringASerValidada = ","; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "12"; Assert.assertTrue(stringASerValidada.matches(pattern)); stringASerValidada = "1A"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "AB"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "A2"; Assert.assertFalse(stringASerValidada.matches(pattern)); } @Test public void semNumeroStringTamanho1() { String stringASerValidada = "A"; String pattern = "\\D*"; Assert.assertTrue(stringASerValidada.matches(pattern)); stringASerValidada = "1"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = ","; Assert.assertTrue(stringASerValidada.matches(pattern)); stringASerValidada = "12"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "1A"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "AB"; Assert.assertTrue(stringASerValidada.matches(pattern)); stringASerValidada = "A2"; Assert.assertFalse(stringASerValidada.matches(pattern)); } @Test public void somenteLetraOuNumeroStringTamanho1() { String stringASerValidada = "A"; String pattern = "\\w*"; Assert.assertTrue(stringASerValidada.matches(pattern)); stringASerValidada = "1"; Assert.assertTrue(stringASerValidada.matches(pattern)); stringASerValidada = ","; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "12"; Assert.assertTrue(stringASerValidada.matches(pattern)); stringASerValidada = "1A"; Assert.assertTrue(stringASerValidada.matches(pattern)); stringASerValidada = "AB"; Assert.assertTrue(stringASerValidada.matches(pattern)); stringASerValidada = "A2"; Assert.assertTrue(stringASerValidada.matches(pattern)); } @Test public void semLetraOuNumeroStringTamanho1() { String stringASerValidada = "A"; String pattern = "\\W*"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "1"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = ","; Assert.assertTrue(stringASerValidada.matches(pattern)); stringASerValidada = "12"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "1A"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "AB"; Assert.assertFalse(stringASerValidada.matches(pattern)); stringASerValidada = "A2"; Assert.assertFalse(stringASerValidada.matches(pattern)); } } |
Perceba que a maior modificação nos resultados foram os testes com tamanho maior que 1. Agora a classe de teste passa a validar também essas Strings que antes sempre retornavam false para qualquer tamanho maior que 1.
finally{
É possível utilizar essas expressões regulares para substituir caracteres em uma String, de uma olhada no método replaceAll ((API da classe String – método replaceAll – link)) da classe String!
No futuro iremos descrever situações do dia a dia sobre como aplicar expressões regulares, fique ligado!
Duvidas ou sugestões? Deixe seu feedback! Isso ajuda a saber a sua opinião sobre os artigos e melhorá-los para o futuro! Isso é muito importante!
Até um próximo post!
Leave a Reply