Pattern e expressões válidas

7 respostas
C

Alguém me explica melhor a expressão válida no codigo seguinte?

Pattern p = Pattern.compile("(\\+?[0-9]{3,15})?");

Keria usar o mesmo método pra validar um nºfiscal, aqui em portugal tem 9 algarismos, será que dá?

Também se usa o mesmo método pra validar Strings, tipo um nome de uma pessoa?
Obrigada,
Cláudia

7 Respostas

T

Para poder ler a documentação, primeiramente vamos pegar cada pedaço.

(+?[0-9]{3,15})?

contém os pedaços:

( --&gt inicia um grupo de uma expresão regular.
+? --&gt indica que há um sinal de "+" opcional (? = opcional)
[0-9]{3,15} --&gt indica que há de 3 a 15 dígitos (0 a 9)
)? —&gt finaliza um grupo de uma expressão regular, e indica que é opcional.

Agora no seu caso como é um número de nota fiscal?
Algo como 123456789 (9 algarismos)?
É mais simples, algo como:
"[0-9]{9}" --&gt exatamente 9 dígitos, de 0 a 9.

Um nome de gente é surpreendentemente difícil se quiser ser muito rigoroso, já que podem aparecer até números, apóstrofos e caracteres especiais.
(Por exemplo, “Dom Pedro d’Alcântara 4º”) .
Acho que só é necessário validar se o nome não está em branco.

P

(\+?[0-9]{3,15})?

vamos por partes

[0-9] é uma e.r. que representa qualquer dígito de 0 até 9

[0-9]{3,15} é a mesma coisa, entretanto é esperado um grupo de no mínimo 3 e no máximo 15 dígitos.

\+? é equivalente à +? pois:

  • o caracter + é um caracter reservado que significa que uma ER se aplica no mínimo uma vez
  • neste exemplo vc quer o caracter literal +, pro isso vc o protege com uma barra invertida na frente.
  • no java, as strings como a que representa uma ER precisa de 2 \ para representar uma \
  • um ? representa ‘opcional’, no caso este numero pode ser precedido de + ou não.

por fim, o (ER)? é algo meio estranho. os parêntesis significam um grupo - exceto quando são escapados para representar o caracter literal ( ou ), essa ER representa um numero de 3 à 15 digitos, com ou sem o sinal de + na frente OU não representa nada.

Faça alguns exemplos de números e veja se eles são encontrados por esta expressão regular, melhor forma de aprender é praticando.

Vc disse que quer validar um número fiscal de 9 digitos. Vc precisa ser mais específica.

Estes números representam números fiscais em portugal?

123.456.789

123456789 -> [0-9]{9}

012.345.678

12345678

C

Já entendi! :slight_smile:
Obrigada

F

Vou aproveitar e pegar uma carona neste tópico. Tem alguma forma de, num texto pegar todas as palavras ‘BODY’ que não estejam entre ‘<>’? Tentei algumas formas, mas nenhuma deu certo.

P

tente assim

(^|[^<])BODY([^>]|$)

ou então remova as tags e do seu texto antes :wink:

T

Pode ser assim também:

import java.util.regex.*;

class TesteRegexpBody {
    public static void main(String[] args) {
        // Este teste troca as palavras BODY por CORPUS se ela não for antecedida por "<"
        // Note que "(?i)" é uma opção que passo para a expressão regular para que ela
        // ignore a diferença entre minúsculas e maiúsculas.
        String teste = "<body ref=\"bleargh\">Este eh o <body>comercial</body> da linha Body Face de cosmeticos, criada pelo Bodynho</body>";
        
        System.out.println (teste.replaceAll ("(?i)(?<![<]/?)BODY\\b", "CORPUS"));
    }
}
A

Revivendo o topico…Pois as respostas foram de alto nivel…
Caso voce queira remover tudo que esta dentro de “<” “>”
Exemplo:

<tr><td class=td>Sou uma td</td></tr>

Saida:

Sou uma td

Regex:

<[\w\D\n]*?>

Thingol e os demais usuarios que fizeram o topico muito bom com as respostas otimas, o que acharam desse regex?

Criado 20 de novembro de 2006
Ultima resposta 24 de jan. de 2007
Respostas 7
Participantes 5