跪求!关于邮箱格式的正则表达式的问题
我现在修改一个程序,其中有一个检验邮箱地址是否正确的正则表达式的函数,如下所示:public bool CheckMailAddress(string str)
{
string[] stra = str.Split(';');
for (int i = 0; i < stra.Length; i ++)
{
string pat = @"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*";
// Compile the regular expression.
Regex r = new Regex(pat, RegexOptions.IgnoreCase);
// Match the regular expression pattern against a text string.
Match m = r.Match(stra[i]);
if (!m.Success)
{
MessageBox.Show("邮箱格式不符!错误邮箱:"+stra[i]);
return false;
}
}
return true;
}
现在的问题是我输入一个非法的邮箱,例如:minxihotel 1104@sina.com这个邮箱存在空格符,而函数的正则表达式缺少对空格符的检验,它会将这个邮箱认为是正确的,我现在需要在该函数的正则表达式中修改来使得能够对该带有空格符的邮箱的检验,希望各位好心的大侠帮帮小弟,如果哪位觉得这个正则表达式还存在其他问题,也请大侠帮助小弟改进,在下不胜感激!
--------------------编程问答-------------------- 关于空格的问题,已经在另一个帖子里给你回复了
至于这个正则是否存在问题,那要看你的规则是什么样的,这个是MS验证控件里带的正则,它具有通用性,但不一定符合你的要求,如果有明确的需求,可以说一下,比如哪些情况是不符合要求的,如果没有什么特殊要求,那就这个就可以了 --------------------编程问答-------------------- 楼上的大哥,多谢你提醒!我是希望能把正则式改成判断一个邮箱是否是合法 正确的,所有的非法邮箱该正则式都能识别出来,但是,我试了一下,还是会抛出邮箱地址无效的异常 --------------------编程问答-------------------- 还是会抛出邮箱地址无效的异常
--------------
异常?怎么会有异常
看你的代码,应该是多个邮箱用“;”分隔,而你的程序是检查到一个非法邮箱就返回false了
给出导致结果错误的源字符串吧
另外说下你的非法邮箱是什么规则 --------------------编程问答-------------------- 刚才那个空格解决了,现在我导入一个有1万多邮箱的文本,其中Godpostman@tom.com这个邮箱是非法的,但我不知道这个邮箱错在哪?而且正则表达式应该怎么改?谢谢大哥指点
--------------------编程问答-------------------- 能不能把正则表达式该得完善一些,可以考虑到种种错误邮箱的形式,从而可以得到一个完善的正则式可以判断出所有的非法邮箱? --------------------编程问答-------------------- ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
可以解决你的问题,我已经测试过
--------------------编程问答-------------------- 这1万多个邮箱地址都是用“;”来分隔的吗?
你现在要达到什么样的效果,是检查只要有一个非法的,就返回false即可,还是说要把所有非法的都取出来,如果是都取出来,那源字符串中的非法邮箱是否保留
Godpostman@tom.com这个邮箱是非法的,但我不知道这个邮箱错在哪?
------------
没必要指出是哪种错误吧,否则你要列出所有可能的错误进行判断,那你的规则越多,你的效率就越低 --------------------编程问答-------------------- 我做的是一个邮件发送系统,我想通过检验出非法的邮箱,对只是合法的邮箱才发送邮件。这一万多邮箱是在一个文本文档里(在该文本里,每个邮箱占一行,没有分隔符),执行时程序将文本里的邮箱地址读入,发送时邮件发送系统中的收件箱栏里每个邮箱地址是以“;”来分隔的,现在程序执行这个操作,其中有非法的邮箱,导致发送不能进行下去,好郁闷啊!请大哥指点 --------------------编程问答-------------------- 用javascript判断
if(!/(\S)+[@]{1}(\S)+[.]{1}(\w)+/.test(txtEmail.value)){ return false; } --------------------编程问答-------------------- 那就ReadLine,每读一行判断一下,合法的加入StringBuilder,过滤出所有的非法邮箱后,把StringBuilder转为string,赋给收件箱栏就可以了,如果有需要,我写个大概实现这功能的代码吧 --------------------编程问答-------------------- 我是新手,不太会写,麻烦你给我写一个,太谢谢了! --------------------编程问答-------------------- 忘了说了,我用的是C#写的 --------------------编程问答-------------------- 测试代码
StringBuilder sb = new StringBuilder();
Regex reg = new Regex(@"^[a-zA-Z0-9_]+([-+.][a-zA-Z0-9_]+)*@[a-zA-Z0-9_]+([-.][a-zA-Z0-9_]+)*\.[a-zA-Z0-9_]+([-.][a-zA-Z0-9_]+)*$", RegexOptions.Compiled);
using (StreamReader sr = new StreamReader(@"e:\test.txt", System.Text.Encoding.Default))
{
while (sr.Peek() >= 0)
{
string line = sr.ReadLine();
if (reg.IsMatch(line))
{
sb.Append(line);
sb.Append(";");
}
}
}
string result = sb.ToString().TrimEnd(';'); //这里是结果
e:\test.txt内容
minxihotel 1104@sina.com
minxihotel1104@sina.com
Godpostman@tom.com
godpostman@tom.com
test@126.com
输出:
minxihotel1104@sina.com;godpostman@tom.com;test@126.com --------------------编程问答-------------------- LS的大哥,多谢你的帮忙,用了你的正则表达式问题得到解决了,前端时间忙别的,忘了给你答复了 --------------------编程问答-------------------- 又见
StringBuilder sb = new StringBuilder();
哈哈 --------------------编程问答-------------------- --------------------编程问答-------------------- /^([a-zA-Z0-9]|[._])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/ --------------------编程问答-------------------- 好的 拿下
补充:.NET技术 , C#