C# 记事本新行和电子邮件的验证
我有一个要求,即我必须验证电子邮件地址(正确的电子邮件格式)以及记事本中的每一行,不包括逗号(,),分号(;),空格(“”)。因此,我做了以下似乎不起作用的事情:C# 记事本新行和电子邮件的验证,c#,asp.net,C#,Asp.net,我有一个要求,即我必须验证电子邮件地址(正确的电子邮件格式)以及记事本中的每一行,不包括逗号(,),分号(;),空格(“”)。因此,我做了以下似乎不起作用的事情: StreamReader file = new StreamReader(@"" + email + ""); string line = file.ReadLine(); if ((line == null || line.Contains(";") || line.Contains(",") || line.Contains(
StreamReader file = new StreamReader(@"" + email + "");
string line = file.ReadLine();
if ((line == null || line.Contains(";") || line.Contains(",") || line.Contains(" ") || line.Contains(email) != IsValidEmail(email)))
{
return "Check your file. Invalid format!";
}
public bool IsValidEmail(string email)
{
try
{
MailAddress emailAddress = new MailAddress(email);
return true;
}
catch
{
return false;
}
}
上面的代码没有验证电子邮件地址,但它确实验证了以下内容(我指的是第一行):
at-2017@yahoo.com; we@yahoo.com //Invalid format
at-2018@yahoo.com
但是,如果分号位于下一行并将其保存到数据库表中,则不会验证此操作:
at-2017@yahoo.com
at-2018@yahoo.com;//Doesn't validate
这很简单,但可能是我做错了什么,这正是我想弄明白的。如有任何建议,我们将不胜感激。这样的建议
void Main()
{
var file = @"at-2017@yahoo.com;
we@yahoo.com
at-2018@yahoo.com
at-2017@yahoo.com
at-2018@yahoo.com;";
using (var memory = new MemoryStream(Encoding.UTF8.GetBytes(file)))
using (var reader = new StreamReader(memory))
{
string line;
while ((line = reader.ReadLine()) != null)
{
var email = new StringBuilder(line)
.Replace(";", string.Empty)
.Replace(",", string.Empty)
.Replace(" ", string.Empty)
.ToString();
var isEmailValid = IsValidEmail(email);
Console.WriteLine($"{isEmailValid,-5}: {email,-20} original: {line}");
}
}
}
bool IsValidEmail(string strIn)
{
// Return true if strIn is in valid e-mail format.
return Regex.IsMatch(strIn, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
}
结果:
True : at-2017@yahoo.com original: at-2017@yahoo.com;
True : we@yahoo.com original: we@yahoo.com
True : at-2018@yahoo.com original: at-2018@yahoo.com
True : at-2017@yahoo.com original: at-2017@yahoo.com
True : at-2018@yahoo.com original: at-2018@yahoo.com;
像这样的
void Main()
{
var file = @"at-2017@yahoo.com;
we@yahoo.com
at-2018@yahoo.com
at-2017@yahoo.com
at-2018@yahoo.com;";
using (var memory = new MemoryStream(Encoding.UTF8.GetBytes(file)))
using (var reader = new StreamReader(memory))
{
string line;
while ((line = reader.ReadLine()) != null)
{
var email = new StringBuilder(line)
.Replace(";", string.Empty)
.Replace(",", string.Empty)
.Replace(" ", string.Empty)
.ToString();
var isEmailValid = IsValidEmail(email);
Console.WriteLine($"{isEmailValid,-5}: {email,-20} original: {line}");
}
}
}
bool IsValidEmail(string strIn)
{
// Return true if strIn is in valid e-mail format.
return Regex.IsMatch(strIn, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
}
结果:
True : at-2017@yahoo.com original: at-2017@yahoo.com;
True : we@yahoo.com original: we@yahoo.com
True : at-2018@yahoo.com original: at-2018@yahoo.com
True : at-2017@yahoo.com original: at-2017@yahoo.com
True : at-2018@yahoo.com original: at-2018@yahoo.com;
如果出现如下情况,请更改您的
:
if ((line == null || line.Contains(";") || line.Contains(",") || line.Contains(" ") || !IsValidEmail(line)))
如果出现如下情况,请更改您的:
if ((line == null || line.Contains(";") || line.Contains(",") || line.Contains(" ") || !IsValidEmail(line)))
看起来您只是在从文件中读取第一行数据。试试这个:
foreach (string line in File.ReadLines(@"path to file"))
{
//do validation for each line
if (IsValidEmail(line) //etc)
{
// do something once line is valid.
}
}
如果编码是一个问题,则此方法有一个重载,您可以在其中指定它:
看起来您只是在从文件中读取第一行数据。试试这个:
foreach (string line in File.ReadLines(@"path to file"))
{
//do validation for each line
if (IsValidEmail(line) //etc)
{
// do something once line is valid.
}
}
如果编码是一个问题,则此方法有一个重载,您可以在其中指定它:
所以您有逗号/分号分隔的文件?每行可以有0-n个地址?不可以@Tomas Jakl。每行应该只有一个电子邮件地址,并且每行不应该有逗号、分号或空格。即使是无效的电子邮件也应该在每一行中进行验证。你只是在读第一行吗?所以你有逗号/分号分隔的文件?每行可以有0-n个地址?不可以@Tomas Jakl。每行应该只有一个电子邮件地址,并且每行不应该有逗号、分号或空格。即使无效的电子邮件也应该在每一行中进行验证。你只是在读第一行吗?回答得好,但是,既然line
已经是string
了,为什么要为每一行读一次构建StringBuilder
。最后可能只有一个电子邮件地址,所以我同意,StringBuilder
是多余的。回答得好,但是,既然line
已经是一个string
了,为什么要为每一行读取构建一个StringBuilder
?可能是我的习惯将未知数量的字符串串联起来(最初我以为一行中有更多的电子邮件地址)。最后,可能只有一个电子邮件地址,因此我同意,StringBuilder
是多余的。谢谢@Ric。我错过了验证的foreach
循环:DYou's welcome。另一个答案也很好,使用了与您类似的代码并添加了while循环。这两个都很好。谢谢@Ric。我错过了foreach
循环验证:不客气。另一个答案也很好,使用了与您类似的代码,添加了while循环。两者都可以完成这项工作。