Ajuda com uma expressao regular

7 respostas
Mikhas

Oi Galera,

Coisa basica,

prociso de uma expressao regular que valide se uma “palavra” NÃO começa com um numero, mas ela não pode ser, por exemplo as palavras “foo” e “bar”?

a primeira parte eu ja fiz:
^[a-zA-Z][a-zA-Z0-9]*

Como eu faço essa negação?
Precisa ser na expressão regular :frowning:

7 Respostas

emmanuelrock

Dê uma olhada em: http://java.sun.com/docs/books/tutorial/essential/regex/pre_char_classes.html

emmanuelrock

Aqui deu certo amigo, dê uma olhada:

public static void main(String[] args) {

       Pattern p = Pattern.compile ("\d{1,}");
       Matcher m = p.matcher("fhj");

       if (!m.find()){
           System.out.println("Não começa com número");
       }
}

Abraço…

T

Expressões regulares não são adequadas para dizer não. Elas são adequadas para dizer “sim”. Tanto é que o “grep”, que é uma ferramenta que filtra texto baseado em expressões regulares, tem a opção “-v” para “inverter” a expressão regular.

O correto, em um programa de produção, é você construir a expressão regular que BATE com aquela coisa, e então negar a condição. No seu caso, você faria algo como:

// Expressão regular: começa com um número OU é a palavra foo OU é a palavra bar
String s = "abacaxi";
if (! s.matches ("(\d+.*|foo|bar)") {
    System.out.println ("s não começa com número, nem é foo, nem é bar");
} else {
    System.out.println ("s começa com número, ou é foo, ou é bar");
}
T

De qualquer maneira, só para você saber, existe uma forma de negar coisas na expressão regular, mas é um bocadinho complexo.

class TesteRegex6 {
    public static void main(String[] args) {
        String[] testes = {
            "abacaxi",
            "123 de Oliveira 4",
            "foo", 
            "bar",
            "42"
        };
        for (String t : testes) {
            System.out.println (t.matches ("(?!(\d+.*|foo|bar)).*"));
        }
    }
}

Eu digo “existe” mas nem sempre funciona direito, portanto é aconselhável você usar sempre a forma positiva da expressão regular, não a negativa, conforme eu mostrei acima. E além disso a forma negativa é MUITO mais lenta que a forma positiva; use sempre a forma normal da expressão regular.

Mikhas

e como eu faço a exclusão de algumas palavras?

T

Você não leu minha expressão regular? Ela exclui, como você pediu, “foo” e “bar”.

Mikhas

Eu não havia atualizado a pagina,
não vi sua resposta.

Grato

Criado 20 de agosto de 2009
Ultima resposta 20 de ago. de 2009
Respostas 7
Participantes 3