查看: 7040|回復: 5|關注: 0
打印 上一主題 下一主題

奇迹觉醒大天使宝箱: [已答復] matlab如何判斷一個字符串string是合法的email格式?

[復制鏈接]

論壇優秀回答者

奇迹觉醒女神之光 www.mhotr.icu 1532

主題

1萬

帖子

482

最佳答案
QQ
  • 關注者: 5261
跳轉到指定樓層
1#
發表于 2013-10-14 08:07:13 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
How to determine a string is a valid email address?

最近在用MATLAB做一個用戶注冊登錄的GUI界面。其中一個條件是判斷用戶輸入的email是否是合法的格式(當然,email是否是真實的Email不在此討論范圍之內)。比如說[email protected][email protected],從格式上講都是合法的,當然[email protected]是否在使用不是本帖的探討范疇。

%假設條件1:email的名稱里只能含有數字/字母/./_
%假設條件2:email的名稱開始和結束只能是字母和數字
%假設條件3:域名里只能含有數字/字母/-/.
%假設條件4:域名開始和結束只能含有數字/字母/

感覺這是一個比較有意思的判斷,歡迎大家拋磚引玉。為了確保大家都能了解你的程序,請務必把條件判斷語句分行寫,同時給出注釋。

測試集:


  1. %測試集,歡迎大家補充
  2. emailStrAll={'[email protected]', ...%合法
  3.     '[email protected]',...%合法
  4.     '[email protected]',...%合法
  5.     '[email protected]',... %合法
  6.     '[email protected]',... %合法
  7.     '[email protected]', ...%以下全部是不合法,歡迎大家補充
  8.     '[email protected]_com', ...
  9.     '[email protected]@gmail.com', ...
  10.     '[email protected]@gmail.com', ...
  11.     'ilovema&[email protected]', ...
  12.     '[email protected]', ...
  13.     '[email protected]', ...
  14.     '[email protected]', ...
  15.     '[email protected]@-.com'};
復制代碼
math (博士、教授)Email: [email protected]     QQ: 1023785467
我在網絡上的言論、見解等只代表我個人的觀念,與任何研究機構、商業公司等無關?;隊閫ü魏畏絞接胛姨教盅鹺圖際跎系奈侍猓ㄑ崳實幕?,請在論壇上發帖提問)。最新日志: 專程去北京拜訪宋知用老師

論壇優秀回答者

1532

主題

1萬

帖子

482

最佳答案
QQ
  • 關注者: 5261
2#
 樓主| 發表于 2013-10-14 08:08:51 | 只看該作者
舉個簡單的例子,

方法一,使用傳統的字符判斷方法:
  1. %測試集,歡迎大家補充
  2. emailStrAll={'[email protected]', ...%合法
  3.     '[email protected]',...%合法
  4.     '[email protected]',...%合法
  5.     '[email protected]',... %合法
  6.     '[email protected]',... %合法
  7.     '[email protected]', ...%以下全部是不合法,歡迎大家補充
  8.     '[email protected]_com', ...
  9.     'ilo[email protected]@gmail.com', ...
  10.     '[email protected]@gmail.com', ...
  11.     'ilovema&[email protected]', ...
  12.     '[email protected]', ...
  13.     '[email protected]', ...
  14.     '[email protected]', ...
  15.     '[email protected]@-.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) || ... %排除[email protected]格式 或者[email protected]格式
  23.             isempty(temp4) || ... %排除[email protected]格式
  24.             strcmp(emailStr(end),'.') %排除[email protected]
  25.         disp([emailStr ' 郵件格式不正確!'])
  26.     else
  27.         disp([emailStr ' 郵件格式正確!']);
  28.     end
  29. end
復制代碼
運行結果(紅色表示程序做出了錯誤的判斷):

[email protected] 郵件格式正確!
[email protected] 郵件格式正確!
[email protected] 郵件格式正確!
[email protected] 郵件格式正確!
[email protected] 郵件格式正確!
[email protected] 郵件格式正確!
[email protected]_com 郵件格式不正確!
[email protected]@gmail.com 郵件格式不正確!
[email protected][email protected] 郵件格式不正確!
ilovema&[email protected] 郵件格式正確!
[email protected] 郵件格式不正確!
[email protected] 郵件格式不正確!
[email protected] 郵件格式正確!
[email protected][email protected] 郵件格式不正確!
math (博士、教授)Email: [email protected]     QQ: 1023785467
我在網絡上的言論、見解等只代表我個人的觀念,與任何研究機構、商業公司等無關?;隊閫ü魏畏絞接胛姨教盅鹺圖際跎系奈侍猓ㄑ崳實幕?,請在論壇上發帖提問)。最新日志: 專程去北京拜訪宋知用老師

論壇優秀回答者

1532

主題

1萬

帖子

482

最佳答案
QQ
  • 關注者: 5261
3#
 樓主| 發表于 2013-10-14 08:26:37 | 只看該作者
方法二: 使用regexpi(str,expression)函數,通過配置不同的expression來檢測。

歡迎大家繼續分享方法!
math (博士、教授)Email: [email protected]     QQ: 1023785467
我在網絡上的言論、見解等只代表我個人的觀念,與任何研究機構、商業公司等無關?;隊閫ü魏畏絞接胛姨教盅鹺圖際跎系奈侍猓ㄑ崳實幕?,請在論壇上發帖提問)。最新日志: 專程去北京拜訪宋知用老師

MATLAB 基礎討論
版塊優秀回答者

入門

246 麥片

財富積分


50500


147

主題

876

帖子

35

最佳答案
  • 關注者: 15
4#
發表于 2014-3-1 18:26:22 | 只看該作者
本帖最后由 213 于 2014-3-1 18:28 編輯

如果 [email protected].-3  郵件格式錯誤的話
  1. %% 測試集,歡迎大家補充
  2. emailStrAll={'[email protected]', ...%合法
  3.     '[email protected]',...%合法
  4.     '[email protected]',...%合法
  5.     '[email protected]',... %合法
  6.     '[email protected]',... %合法
  7.     '[email protected]', ...%以下全部是不合法,歡迎大家補充
  8.     '[email protected]_com', ...
  9.     '[email protected]@gmail.com', ...
  10.     '[email protected]@gmail.com', ...
  11.     'ilovema&[email protected]', ...
  12.     '[email protected]', ...
  13.     '[email protected]', ...
  14.     '[email protected]', ...
  15.     '[email protected]'};
  16. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  17. %% 方法二
  18. string=emailStrAll;
  19. %string='[email protected]';
  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
5#
發表于 2014-3-1 18:34:24 | 只看該作者
本帖最后由 213 于 2014-3-1 18:47 編輯
  1. %% 測試集,歡迎大家補充
  2. emailStrAll={'[email protected]', ...%合法
  3.     '[email protected]',...%合法
  4.     '[email protected]',...%合法
  5.     '[email protected]',... %合法
  6.     '[email protected]',... %合法
  7.     '[email protected]', ...%以下全部是不合法,歡迎大家補充
  8.     '[email protected]_com', ...
  9.     '[email protected]@gmail.com', ...
  10.     '[email protected]@gmail.com', ...
  11.     'ilovema&[email protected]', ...
  12.     '[email protected]', ...
  13.     '[email protected]', ...
  14.     '[email protected]', ...
  15.     '[email protected]'};
  16. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  17. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  18.   %% 方法一
  19. string='[email protected]_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
復制代碼

論壇優秀回答者

入門

251 麥片

財富積分


50500


14

主題

716

帖子

50

最佳答案
QQ
  • 關注者: 10
6#
發表于 2014-3-1 19:54:01 | 只看該作者
雖有動手的興趣,但無動手的激情。那就動腦:

1 確定有什么,而不去排除沒有什么。也就是數據庫的意思。
(1)確定字符串的只含一個元素的子集:數字、字母、下劃線、英文點、@。
只要出現不在此集的字符,直接報錯。


2 字符串排序規則/位置
(1)只能有一個@,若不是,直接報錯

(2)@之前,英文小點不能在開頭,否則直接報錯。
(至于下劃線開頭這個?[email protected]這種呢?)

(3)@之后必然必然有英文和一個英文點,并且無下劃線。
這樣檢查,開頭必是英文,若不是,直接報錯;
若正確繼續,直到碰到英文點,若沒有,直接報錯;
設置一下loop條件,記個數,正確的必然l類似這樣的:@xxx.kkk、@xxx.kkk.uuu

備注:
關于第三點,還是參照域名命名規則吧. 關于字符數據庫,也不是確切的,比如,我們仍然可以有“-”。


回答之,理清思路,以備他日之需。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規則

關閉

站長推薦上一條 /3 下一條

快速回復 奇迹觉醒女神之光 返回列表