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