2013-02-03 18 views
2

正则表达式"String regex = "[0-9a-z][email protected][0-9a-z]+.+[0-9a-z]";"用于测试电子邮件验证。基本上,即时通讯尝试使电子邮件只会匹配这个模式,如果电子邮件以字母数字字符串开头,后跟1 @符号,接着是另一串字母数字字符,然后是1,然后是最后一个一串字母数字字符。什么是失败的是,当我输入一个电子邮件没有字符串后的最后一个字符串,程序将仍然匹配正则表达式字符串。我该怎么做才能使之后必须有另一串字母数字。整个代码是:正则表达式java模式不验证?

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

public class Regex 
{ 
    public static void main (String[]args){ 

     Scanner input = new Scanner(System.in); 
     System.out.println("Please enter your Email"); 
     String mail = input.nextLine(); 

     String regex = "[0-9a-z][email protected][0-9a-z]+.+[0-9a-z]"; 

     Pattern p = Pattern.compile(regex); 
     Matcher m = p.matcher(mail); 

     if(m.find()) { 
      System.out.println("VALID"); 
     } else { 
      System.out.println("INVALD"); 
     } 
    } 
} 
+0

。+会给你“至少一个任意字符”。我想你的意思是在最后一个括号后面加上“+”。 –

+1

对于这类问题,http://www.regexper.com/是我的首选工具。 –

+1

相关http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address – andersoj

回答

1

稍微好一点的正则表达式将包括线^和行末$锚的开端。

否则它只需要匹配字符串中有效电子邮件的单个实例,并且它会通过。另外,您也可以通过添加{2,4}将其限制为2至4个字符,而不是加号来表示1或更多。如果没有这些替代类似

myemail @ gmail.com @ thisIsOdd.helloworld.anythingelse

会错误地有效。

String regex = "^[0-9a-z][email protected]([0-9a-z]+[.])+[0-9a-z]{2,4}$";

4

一种未转义.在表达式代表任何字符。您需要使用\\.[.]来匹配文字点。

String regex = "[0-9a-z][email protected][0-9a-z]+[.]+[0-9a-z]"; 

点之后的+意味着“一次或多次出现前面的表达”。以上,“以前的表达”是单点。为了匹配电子邮件的域名地址多段,你需要添加括号:

String regex = "[0-9a-z][email protected]([0-9a-z]+[.])+[0-9a-z]+"; 
+3

我认为OP在最后一组括号后忘记了一个“+”;我怀疑他希望地址以一个点结尾,然后是一个字母数字 –

+0

@ G.Bach你说得对,最后没有加号。 – dasblinkenlight

+0

他也不希望电子邮件域地址中有多个段,尽管它们是完全有效的。在任何情况下都不应该使用正则表达式来验证电子邮件地址,这是非常错误的。 –