[RESOLVIDO] RegEx para validação

por favor alguém conhece uma expressão regular pra validar da seguinte forma:

  • tem de ter 11 números;
  • nao podem ser iguais tipo 111111111111 22222222222 333333333333…

Você quer validar um CPF? Não pode ser feito só com uma expressão regular.
Mas se você quer só ver se tem 11 dígitos, sendo que não podem ser iguais, isso pode ser feito com:

import java.util.regex.*;
import java.util.*;

class TesteRegex9 {
    public static void main(String[] args) {
        String[] testes = {
           //12345678901
            "11111111111",
            "12345678901",
            "123456789012",
            "9",
        };
        String regex = 
          "(?!(\d)\1{10})\d{11}";
        Pattern pat = Pattern.compile (regex);
        for (String expr : testes) {
            Matcher mat = pat.matcher (expr);
            System.out.printf ("%s -> %s%n", expr, mat.matches());
        }
    }
}

Por favor, consulte o site: http://aurelio.net/er e também o site: http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/util/regex/Pattern.html para entender o que foi feito. Não vou explicar nadinha de nada.

por favor poderia traduzir a expressão para mim: “(?!(\d)\1{10})\d{11}”;

???

:smiley:
abraço

Eu disse que não ia explicar. Eu deixo isso aos universitários.

hehehe… ok :D…

juro que não tinha visto o trecho q lá abaixo q vc disse isso… hehehe… valeu mesmo… abraço

AS

só uma pergunta, tipo queria ver se a string teste é falsa ou verdadeira como invoco o RegEx?

[code]public static void main(String[] args) {
String[] testes = { “11111111111”, “12345678901”, “123456789012”, “9”, };
String regex = “(?!(\d)\1{10})\d{11}”;
Pattern pat = Pattern.compile(regex);
String teste = “11111111111”;
System.out.println(teste);
/for (String expr : testes) {
Matcher mat = pat.matcher(expr);
System.out.printf("%s -> %s%n", expr, mat.matches());
}
/

}[/code]

Rode o programa passo-a-passo (o original, não o seu). Você cortou coisas demais

hehehe

agora ficou claro…

abraço :smiley:

opa

só pra explicar mais ou menos a expressão regular b\d{11}[/b]

antes é preciso saber que:
\d (ou \d, quando ta dentro Strings literais) é caractere numérico;
b[/b] agrupa e identifica um grupo que tenha um caractere numérico;
\1 é como se “lesse o que tem dentro do grupo 1”;
\1{10} exatamente 10 repetições do grupo 1 (no caso um caractere numérico).

Agora explicando a expressão por partes:
(?!(\d)\1{10})

-> esta parte b[/b] faz uso zero-width negative lookahead, sendo:
—> zero-width: Não consome os caracteres encontrados;
—> lookahead: Onde os próximos caracteres;
—> negative: Não casam com a Exp interna.

Traduzindo: b[/b] faz que não case e não consuma Strings com 11 caracteres numéricos iguais:
Pois, primeiro ela agrupa no grupo 1, um caractere numério. Depois mais 10 vezes o caractere encontrado.
Com o zero-width negative lookahead, o processador de regex irá recusar Strings que contenha 1 caractere seguido por ele mesmo repetido 10 vezes.

Mas essa era exatamente a busca que queria! Porque só isto não basta?
Simples, o zero-width não consome os caracteres encontrados, então você não poderia usar o resultado da sua busca.

A segunda parte:
\d{11}
Simplesmente busca e consome (você poderá usar o resultado da busca) 11 caracteres numéricos;

Juntando as duas partes, você tem primeiramente uma expressão que ignore String com 11 caracteres iguais, e se caso passar pelo teste, a busca que consome o resultado de 11 caracteres.

É isso aí! :smiley:

Um bom lugar pra apreder regex é aqui: http://www.regular-expressions.info
Outro lugar excelente pra aprender regex e na prática é no próprio Eclipse! Ctrl-F, habilita o checkbox de expressão regular, e da Ctrl-Espaço dentro do campo de busca. Ele tem uma espécie de Javadoc de cada recurso do regex com exemplos!

regex é uma arte! resolve todos os problemas da humanidade! :lol: :lol:

Abraços!

Parabéns, Daniel! Explicou direitinho a expressão regular.
De fato, é meio chato escrever uma expressão regular que pegue coisas repetidas ou que não bata, de propósito, com alguma coisa.
O que foi pedido tem exatamente essas duas coisas,
O problema do “(?!” é que, na verdade, tem uso limitado e não pode ser usado sempre para fazer qualquer negação. Nesse caso em particular até foi possível usar “(?!” mas pode haver muitos casos em que é impossível usá-lo de forma eficiente ou simples de compreender. *
Outra coisa são as expressões com repetição. No começo eu estava pensando em
(0{11}|1{11}|2{11}|3{11}|4{11}|5{11}|6{11}|7{11}|8{11}|9{11})
que é realmente porco. Depois é que me lembrei que se pode usar “\1”, “\2” … até “\9” dentro de uma expressão para poder pegar esses casos em que uma expressão se repete.

  • Normalmente eu acho que é mais fácil ter 2 (ou mais) expressões: uma que bate com o que você quer, e outra que bate com o que você NÃO quer.

muitíssimo obrigado pela atenção gente…