Problema com expressão regular

4 respostas
Andre_Rosa

Olá, estou fazendo um programa, onde o usuário deve inserir uma expressão regular para verificar se um e-mail é válido ou não. A expressão está certa, já que eu havias testado ela, mas com o usuário à informando, não funciona. O código é este:

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

public class Main {


    public static void main(String[] args) {

        Scanner exp = new Scanner (System.in);
        System.out.println("Informe a expressão regular: ");
        String expReg = exp.nextLine();

        //  .+@.+\.[a-z]+

        Scanner  entrada = new Scanner (System.in);

        System.out.print("Entre com o e-mail: ");

        String mail = entrada.nextLine();

        Pattern padrao = Pattern.compile(expReg);

        Matcher pesquisa = padrao.matcher(mail);

        if (pesquisa.matches()){
            System.out.println("O e-mail: "+mail+" é válido.");
             }
 else
        {
            System.out.println("E-mail inválido!");
 }

    }

}

A saída é esta:

Informe a expressão regular:
.+@.+\\.[a-z]+
Entre com o e-mail: [email removido]
E-mail inválido!

Alguém sabe qual é o problema?

Obg,
André.

4 Respostas

M

Sua expressão tem duas barras. Para a String no meio do código a primeira barra é caractere de escape, na hora de você digitar é uma barra normal. Para funcionar via teclado, tira uma das barras antes do ponto.

Andre_Rosa

Opa, funcionou. Entendi o que você quis dizer. Mas o correto (pelo menos, o que pensei), não seria usar:

.+@.+\\.[a-z]+

? Pois assim eu teria as duas barras. Enfim, desta forma não funcionou, e da sua (com apenas uma barra) funcionou perfeitamente. Só não consegui entender o porque.

Obrigado.

M

a “” é o caractere de escape da String.

Como você faz para informar uma nova linha? “\n”
Como você faz para informar um tab? “\t”

e assim por diante. Você diz para o compilador: “Olha só, depois dessa barra invertida eu vou mandar um caractere que você reconhece e você faz uma ação especial com ele, não considera ele um cactere normal”. Mas e quando você quer informar uma “”? “Ah, eu informo só uma barra normal e pronto”, você pode pensar. Mas e em uma situação como essa:

“C:\Temp\new folder”

ele deveria considerar uma quebra de linha? Não, a gente que a barra invertida seguido do n mesmo. Nesse caso a gente usa duas barras. A primeira barra é o caractere de escape. A segunda barra é um dos caracteres reconhecidos pelo compilador. A “função” dele é só exibir uma barra invertida.

Esse é o motivo pelo qual precisamos de duas barras na String.

Quando você digitar um valor, não existe o conceito de caractere de escape no texto digitado. Se você digitar \n, vai ser \n mesmo, ele não vai entender como uma nova linha. Por isso, quando você digita \ ele considera só uma barra normal.

Andre_Rosa

Bem mais claro agora! ^^

Obg,
André.

Criado 21 de abril de 2011
Ultima resposta 21 de abr. de 2011
Respostas 4
Participantes 2