查看: 6476|回复: 5|关注: 0

[已答复] matlab如何判断一个字符串string是合法的email格式?

[复制链接]

论坛优秀回答者

1532

主题

1万

帖子

482

最佳答案
QQ
  • 关注者: 5082
发表于 2013-10-14 08:07:13 | 显示全部楼层 |阅读模式
How to determine a string is a valid email address?

最近在用MATLAB做一个用户注册登录的GUI界面。其中一个条件是判断用户输入的email是否是合法的格式(当然,email是否是真实的Email不在此讨论范围之内)。比如说ilovematlab@gmail.comilovematlab@gmail.com.cn,从格式上讲都是合法的,当然ilovematlab@gmail.com.cn是否在使用不是本帖的探讨范畴。

%假设条件1:email的名称里只能含有数字/字母/./_
%假设条件2:email的名称开始和结束只能是字母和数字
%假设条件3:域名里只能含有数字/字母/-/.
%假设条件4:域名开始和结束只能含有数字/字母/

感觉这是一个比较有意思的判断,欢迎大家抛砖引玉。为了确保大家都能了解你的程序,请务必把条件判断语句分行写,同时给出注释。

测试集:


  1. %测试集,欢迎大家补充
  2. emailStrAll={'ilovematlab123@gmail.com', ...%合法
  3.     'ilovematlab123@gmail.com.cn',...%合法
  4.     'ilove.matlab@gmail.com.cn',...%合法
  5.     'ilove_matlab@gmail.com',... %合法
  6.     'ilove_matlab@gmail-123.com',... %合法
  7.     'ilovematlab.@gmail.com', ...%以下全部是不合法,欢迎大家补充
  8.     '_ilovematlab@gmail_com', ...
  9.     'ilovematlab@@gmail.com', ...
  10.     'ilovem@matlab@gmail.com', ...
  11.     'ilovema&tlab@gmail.com.cn', ...
  12.     'ilovematlab@gmail', ...
  13.     'ilovematlab@gmail.', ...
  14.     'ilovematlab@.gmail', ...
  15.     'ilovematlab@i@-.com'};
复制代码
math (博士、教授)Email: iLoveMATLAB@gmail.com     QQ: 1023785467
我在网络上的言论、见解等只代表我个人的观念,与任何研究机构、商业公司等无关。欢迎你通过任何方式与我探讨学术和技术上的问题(学生提问的话,请在论坛上发帖提问)。最新日志: 专程去北京拜访宋知用老师

论坛优秀回答者

1532

主题

1万

帖子

482

最佳答案
QQ
  • 关注者: 5082
 楼主| 发表于 2013-10-14 08:08:51 | 显示全部楼层
举个简单的例子,

方法一,使用传统的字符判断方法:
  1. %测试集,欢迎大家补充
  2. emailStrAll={'ilovematlab123@gmail.com', ...%合法
  3.     'ilovematlab123@gmail.com.cn',...%合法
  4.     'ilove.matlab@gmail.com.cn',...%合法
  5.     'ilove_matlab@gmail.com',... %合法
  6.     'ilove_matlab@gmail-123.com',... %合法
  7.     'ilovematlab.@gmail.com', ...%以下全部是不合法,欢迎大家补充
  8.     '_ilovematlab@gmail_com', ...
  9.     'ilovematlab@@gmail.com', ...
  10.     'ilovem@matlab@gmail.com', ...
  11.     'ilovema&tlab@gmail.com.cn', ...
  12.     'ilovematlab@gmail', ...
  13.     'ilovematlab@gmail.', ...
  14.     'ilovematlab@.gmail', ...
  15.     'ilovematlab@i@-.com'};

  16. for i=1:size(emailStrAll,2)
  17.     emailStr=emailStrAll{1,i};
  18.     [temp1, temp2] = strread(emailStr, '%s %s', 'delimiter','@'); %得到ilovematlab和gmail.com
  19.     [temp3, temp4] = strread(temp2{1,1}, '%s %s', 'delimiter','.'); %得到gmail和com
  20.    
  21.     if isempty(temp1) || ... %@排除@ilovematlab.com格式
  22.             isempty(temp3) || ... %排除ilovematlab@.gmail.com格式 或者ilovematlab@格式
  23.             isempty(temp4) || ... %排除ilovematlab@gmail格式
  24.             strcmp(emailStr(end),'.') %排除ilovematlab@gmail.com.
  25.         disp([emailStr ' 邮件格式不正确!'])
  26.     else
  27.         disp([emailStr ' 邮件格式正确!']);
  28.     end
  29. end
复制代码
运行结果(红色表示程序做出了错误的判断):

ilovematlab123@gmail.com 邮件格式正确!
ilovematlab123@gmail.com.cn 邮件格式正确!
ilove.matlab@gmail.com.cn 邮件格式正确!
ilove_matlab@gmail.com 邮件格式正确!
ilove_matlab@gmail-123.com 邮件格式正确!
ilovematlab.@gmail.com 邮件格式正确!
_ilovematlab@gmail_com 邮件格式不正确!
ilovematlab@@gmail.com 邮件格式不正确!
ilovem@matlab@gmail.com 邮件格式不正确!
ilovema&tlab@gmail.com.cn 邮件格式正确!
ilovematlab@gmail 邮件格式不正确!
ilovematlab@gmail. 邮件格式不正确!
ilovematlab@.gmail 邮件格式正确!
ilovematlab@i@-.com 邮件格式不正确!
math (博士、教授)Email: iLoveMATLAB@gmail.com     QQ: 1023785467
我在网络上的言论、见解等只代表我个人的观念,与任何研究机构、商业公司等无关。欢迎你通过任何方式与我探讨学术和技术上的问题(学生提问的话,请在论坛上发帖提问)。最新日志: 专程去北京拜访宋知用老师

论坛优秀回答者

1532

主题

1万

帖子

482

最佳答案
QQ
  • 关注者: 5082
 楼主| 发表于 2013-10-14 08:26:37 | 显示全部楼层
方法二: 使用regexpi(str,expression)函数,通过配置不同的expression来检测。

欢迎大家继续分享方法!
math (博士、教授)Email: iLoveMATLAB@gmail.com     QQ: 1023785467
我在网络上的言论、见解等只代表我个人的观念,与任何研究机构、商业公司等无关。欢迎你通过任何方式与我探讨学术和技术上的问题(学生提问的话,请在论坛上发帖提问)。最新日志: 专程去北京拜访宋知用老师

MATLAB 基础讨论
版块优秀回答者

入门

246 麦片

财富积分


50500


147

主题

876

帖子

35

最佳答案
  • 关注者: 15
发表于 2014-3-1 18:26:22 | 显示全部楼层
本帖最后由 213 于 2014-3-1 18:28 编辑

如果 I._love_.matlab@2-.1.-3  邮件格式错误的话
  1. %% 测试集,欢迎大家补充
  2. emailStrAll={'ilovematlab123@gmail.com', ...%合法
  3.     'ilovematlab123@gmail.com.cn',...%合法
  4.     'ilove.matlab@gmail.com.cn',...%合法
  5.     'ilove_matlab@gmail.com',... %合法
  6.     'ilove_matlab@gmail-123.com',... %合法
  7.     'ilovematlab.@gmail.com', ...%以下全部是不合法,欢迎大家补充
  8.     '_ilovematlab@gmail_com', ...
  9.     'ilovematlab@@gmail.com', ...
  10.     'ilovem@matlab@gmail.com', ...
  11.     'ilovema&tlab@gmail.com.cn', ...
  12.     'ilovematlab@gmail', ...
  13.     'ilovematlab@gmail.', ...
  14.     'ilovematlab@.gmail', ...
  15.     'ilovematlab@i-com'};
  16. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  17. %% 方法二
  18. string=emailStrAll;
  19. %string='ilovemat_la.b123@Gmai-l.com';
  20. %(1)@前----a仅由\w和\.组成,b首尾仅由字母数字构成,c内部没有连续的_\.
  21. %(2)@----有且仅有一个@符号
  22. %(3)@后到@后的第一个\.----a仅由[a-zA-Z0-9\-]组成,b首尾仅由字母数字构成,c内部没有连续的-
  23. %(4)@后的第一个\.----有且仅有一个
  24. %(5)@后的第一个\.以后----a仅由[a-zA-Z0-9\-.]组成,b首尾仅由字母数字构成,c内部没有连续的-\.
  25. expressn=['^[a-z0-9]+(?:[_.][a-z0-9]+)*@'...   %满足(1)(2)
  26.     '[a-z0-9]+(?:\-[a-z0-9]+)*\.'...           %满足(3)(4)
  27.     '[a-z0-9]+(?:[\-.][a-z0-9]+)*$'];          %满足(5)
  28. %相较帖子里的假设,这里主要是增加了一条:
  29. %出现连续的-_\.时,认为不合法
  30. isvaild=regexpi(string,expressn);
  31. %%
  32. reslstr={'合法','不合法'};
  33. disp([emailStrAll',cellfun(@(x) reslstr(isempty(x)+1),isvaild)'])
  34. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  35. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
复制代码

MATLAB 基础讨论
版块优秀回答者

入门

246 麦片

财富积分


50500


147

主题

876

帖子

35

最佳答案
  • 关注者: 15
发表于 2014-3-1 18:34:24 | 显示全部楼层
本帖最后由 213 于 2014-3-1 18:47 编辑
  1. %% 测试集,欢迎大家补充
  2. emailStrAll={'ilovematlab123@gmail.com', ...%合法
  3.     'ilovematlab123@gmail.com.cn',...%合法
  4.     'ilove.matlab@gmail.com.cn',...%合法
  5.     'ilove_matlab@gmail.com',... %合法
  6.     'ilove_matlab@gmail-123.com',... %合法
  7.     'ilovematlab.@gmail.com', ...%以下全部是不合法,欢迎大家补充
  8.     '_ilovematlab@gmail_com', ...
  9.     'ilovematlab@@gmail.com', ...
  10.     'ilovem@matlab@gmail.com', ...
  11.     'ilovema&tlab@gmail.com.cn', ...
  12.     'ilovematlab@gmail', ...
  13.     'ilovematlab@gmail.', ...
  14.     'ilovematlab@.gmail', ...
  15.     'ilovematlab@i-com'};
  16. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  17. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  18.   %% 方法一
  19. string='ilov.em$at.@.la._b123G.mai-l.com';
  20. string=emailStrAll{15};
  21. C=textscan(string,'%s','Delimiter','@');
  22. if size(C{1},1)==2
  23.     b=cellfun(@(x)textscan([x,'.'],'%s','Delimiter','.'),C{1});
  24.     %PS=cell2struct(C{1},{'prefix','suffix'},1);
  25.     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  26.     %@前是否含有非法字符
  27.     flag(1)=any(regexp([b{1}{:}],'[^\w]'));
  28.     %@后是否含有非法字符
  29.     flag(2)=any(regexp([b{2}{:}],'[^a-zA-Z\-0-9]'));
  30.     %%%
  31.     % %     %判断是否存在连续的'.'   或是出现在开头和结尾的'.'
  32.     % %     flag(4)=any(cellfun(@isempty,cat(1,b{:})));
  33.     %%%
  34.     % 判断是否存在连续的'.'   或是出现在开头和结尾的非法字符
  35.     try
  36.         flag(3)=any(cellfun(@(x) any(regexp(x([1,end]),'[^a-zA-Z0-9]')),cat(1,b{:})));
  37.     catch err
  38.         flag(3)=1;
  39.     end
  40.     % 判断@后是否有.
  41.     flag(4)=size(b{2},1)<=1;
  42.     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  43.     if all(~flag)
  44.         disp('vaild email address')
  45.     else
  46.         disp('invaild')
  47.         disp(['flag:',mat2str(flag)])
  48.     end
  49. else
  50.     disp('the number of ''@'' signs is not equal to one')
  51. end
复制代码

论坛优秀回答者

入门

250 麦片

财富积分


50500


14

主题

716

帖子

50

最佳答案
QQ
  • 关注者: 10
发表于 2014-3-1 19:54:01 | 显示全部楼层
虽有动手的兴趣,但无动手的激情。那就动脑:

1 确定有什么,而不去排除没有什么。也就是数据库的意思。
(1)确定字符串的只含一个元素的子集:数字、字母、下划线、英文点、@。
只要出现不在此集的字符,直接报错。


2 字符串排序规则/位置
(1)只能有一个@,若不是,直接报错

(2)@之前,英文小点不能在开头,否则直接报错。
(至于下划线开头这个?mail.@这种呢?)

(3)@之后必然必然有英文和一个英文点,并且无下划线。
这样检查,开头必是英文,若不是,直接报错;
若正确继续,直到碰到英文点,若没有,直接报错;
设置一下loop条件,记个数,正确的必然l类似这样的:@xxx.kkk、@xxx.kkk.uuu

备注:
关于第三点,还是参照域名命名规则吧. 关于字符数据库,也不是确切的,比如,我们仍然可以有“-”。


回答之,理清思路,以备他日之需。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表