正则表达式电子邮件验证

时间:2017-09-13 10:40:34

标签: java regex count

这是我之前发表的文章的延续,我的代码:

public class Main {

static String theFile = "C:\\Users\\Pc\\Desktop\\textfile.txt";

public static boolean validate(String input) {
    boolean status = false;
    String REGEX = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
            + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";

    Pattern pattern = Pattern.compile(REGEX);
    Matcher matcher = pattern.matcher(input);
    if (matcher.matches()) {
        status = true;
    } else {
        status = false;
    }
    return status;
}

public static void main(String[] args) {
    BufferedReader br = null;

    try {
        br = new BufferedReader(new FileReader(theFile));
        String line;
        int count = 0;
        while ((line = br.readLine()) != null) {
            String[] arr = line.split("#");
            for (int x = 0; x < arr.length; x++) {
                if (arr[x].equals(validate(theFile))) {
                    count++;
                }
                System.out.println("no of matches " + count);

            }
        }

    } catch (IOException e) {
        e.printStackTrace();
    }

    Main.validate(theFile);
}

}

显示结果: 没有比赛0 没有比赛0 没有比赛0 没有匹配0

这是输入文件中的文字 sjbfbhbs@yahoo.com#fgfgfgf@yahoo.com#ghghgh@gamil.com#fhfbs@y.com

我的输出应该是三封电子邮件,因为最后一个字符串不是标准的电子邮件格式 我知道我不想通过(arr[x].validate(theFile)))

2 个答案:

答案 0 :(得分:1)

您的代码中存在多个错误:

  1. if (arr[x].equals(validate(theFile)))检查邮件地址字符串是否等于从validate()方法获得的布尔值。情况永远不会如此。
  2. validate()方法中,如果您只想检查字符串是否与正则表达式匹配,则可以使用string.matches(pattern)执行此操作 - 因此您只需要一行代码(实际上不是错误的,但这种方式更优雅)
  3. 分割输入字符串(行)后,会留下空白,因为您只能在#符号处拆分。您可以trim()之后的每个字符串删除这些字符串(请参阅下面的代码)或split() \\s*#\\s*而不只是#
  4. 这是一个包含所有修复的示例(我省略了您读取文件的部分,并使用了包含您邮件地址的字符串!):

    public class Main {
    
        private static final String PATTERN_MAIL
            = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
    
        public static boolean validate(String input) {
            return input.matches(PATTERN_MAIL);
        }
    
        public static void main(String[] args) {
            String line = "sjbfbhbs@yahoo.com # fgfgfgf@yahoo.com # ghghgh@gamil.com #fhfbs@y.com";
            String[] arr = line.split("#");
            int count = 0;
    
            for (int x = 0; x < arr.length; x++) {
                if (validate(arr[x].trim())) {
                    count++;
                }
                System.out.println("no of matches " + count);
            }
        }
    
    }
    

    打印:

    no of matches 1
    no of matches 2
    no of matches 3
    no of matches 4
    

    编辑:如果模式不匹配上一个邮件地址,则您必须更改模式。现在它匹配所有这些。

答案 1 :(得分:1)

我一直用这个:

    public static bool Validate(string email)
    {
        string expressions = @"^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$";
        return Regex.IsMatch(email, expressions);
    }

注意:如果有多个@符号,我还有一个“清理”字符串的函数。

编辑:以下是我如何清除额外的@符号。请注意,这将保留它找到的FIRST @,然后删除其余部分。在运行验证功能之前,应该使用此功能。

    public static string CleanEmail(string input)
    {
        string output = "";

        try
        {
            if (input.Length > 0)
            {
                string first_pass = Regex.Replace(input, @"[^\w\.@-]", "");
                List<string> second_pass = new List<string>();
                string third_pass = first_pass;
                string final_pass = "";

                if (first_pass.Contains("@"))
                {
                    second_pass = first_pass.Split('@').ToList();

                    if (second_pass.Count >= 2)
                    {
                        string second_pass_0 = second_pass[0];
                        string second_pass_1 = second_pass[1];

                        third_pass = second_pass_0 + "@" + second_pass_1;

                        second_pass.Remove(second_pass_0);
                        second_pass.Remove(second_pass_1);
                    }
                }

                if (second_pass.Count > 0)
                {
                    final_pass = third_pass + string.Join("", second_pass.ToArray());
                }
                else
                {
                    final_pass = third_pass;
                }

                output = final_pass;

            }
        }
        catch (Exception Ex)
        {

        }

        return output;
    }