HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
1117
可憐正規表現によるメールアドレスのチェック3解決


可憐

リンク

2015/11/17(Tue) 17:09:52|NO.73083

正規表現を用いてメールアドレスの形式チェックを行いたいと思っていますが
分からないので質問させて頂きました。

mod_regexp.asを使えば簡単かな。と色々見たものの正規表現が私には難易度が高く
できませんでした。

正規表現を用いてメールアドレスの形式をチェックする方法を教えて頂ければ嬉しいです。

よろしくおねがいします。



この記事に返信する


sakura

リンク

2015/11/17(Tue) 21:17:57|NO.73090

こんな感じでしょうか?
テスト用のサンプルを載せておきます。8年ぶりぐらいのHSPなので、・・・・(^^;
わたしも詳しくはないのですが、注意事項として、正規表現パーターンを指定する場合は、
文字列変数に渡す場合と、input等に入力する場合は\\の数が異なるので注意して下さい。


// ***** メールアドレスの検索パータン ***** //[\\w\\d_-]+@[\\w\\d_-]+\.[\\w\\d._-]+ ;パターンを直接文字列変数に指定する場合 //[\w\d_-]+@[\w\d_-]+.[\w\d._-]+ ;パターンをinput等に入力して指定する場合 ;***** 簡易版RegExpによる検索・置換モジュール ***** #module #deffunc RegReplace var prm1, var prm2, var prm3, int prm4 ; prm1 : 結果取得用バッファ (文字列型変数) ; prm2 : 検索用パターン ; prm3 : 置換用パターンまたは置換文字列 ; prm4 : グローバルマッチ (prm4=1でTrue) newcom regEx, "VBScript.RegExp" comres prm1 regEx("Pattern")= prm2 regEx("Global") = prm4 ;regEx("IgnoreCase") = 0 regEx->"Replace" prm1, prm3 delcom regEx return #deffunc RegSearch var prm1, var prm2, int prm3 ; prm1 : 結果取得用バッファ (文字列型変数) ; prm2 : 検索用パターン ; prm3 : グローバルマッチ (prm3=1でTrue) newcom regEx, "VBScript.RegExp" regEx("Pattern") = prm2 regEx("Global") = prm3 ;regEx("IgnoreCase") = 0 comres result regEx->"Execute" prm1 sdim prm1 c = result("Count") if c==0 { delcom result delcom regEx return -1 } repeat c oMatch = result("Item", cnt) ;oMatch("FirstIndex") ;oMatch("Length") prm1 += oMatch("Value")+"\n" loop delcom oMatch delcom result delcom regEx return c #global ;***** 検証用サンプル ***** screen 0,640,480,0,ginfo_dispx-640>>1,ginfo_dispy-480>>1 title "正規表現パターン検証用サンプル" onexit *owari ; 起動ディレクトリ取得 sdim Startdir,260 if hspstat&1=0 { Startdir=dir_exe+"\\" : chdir dir_exe } else { Startdir=dir_cur+"\\" } chdir Startdir sdim buf,32000 sdim oFile,260 sdim patstr,128 sdim repstr,128 color 0,0,0 font "MS ゴシック",14 : objmode 2 pos 6,6 : mes "File" : objsize ginfo(10)-150,22 pos 80,2 : input oFile objsize 56,22 pos ginfo(10)-66,2 : button "参照",*fdialog pos 6,30 : mes "検索文字列" : objsize ginfo(10)-150,22 pos 80,26 : input patstr objsize 56,22 pos ginfo(10)-66,26 : button "検索",*search pos 6,56 : mes "置換文字列" : objsize ginfo(10)-150,22 pos 80,54 : input repstr objsize 56,22 pos ginfo(10)-66,54 : button "置換",*replace ;**** mesboxを作成 **** pos 0,140 mesbox buf,ginfo(10)-4,ginfo(11)-164,5 : id=stat stop *fdialog dialog "",16 : if stat=0 : stop notesel buf : noteload refstr oFile = refstr objprm 0,oFile objprm id,buf stop *search RegSearch buf, patstr, 1 objprm id,buf color 255,255,255 : boxf 8,80,ginfo(10),120 color 255,0,0 if stat=-1 { pos 10,100 : mes "検索パターンに一致しません。" }else{ pos 10,100 : mes "検索パターンに一致しました。 一致件数 = "+stat+"件" } color 0,0,0 stop *replace color 255,255,255 : boxf 8,80,ginfo(10),120 if patstr="" : dialog "検索文字列が指定されていません。",0 : stop RegReplace buf, patstr, repstr, 1 objprm id,buf color 0,0,0 stop *owari end



GENKI

リンク

2015/11/18(Wed) 00:36:37|NO.73092

メールアドレスとして正しいかどうかチェックする正規表現について調べてみると、どこのサイトもそれじゃダメだと罵り合いが行われているようです。
規約に則って正確に完全に表現するのはとても難しく、また正規表現では完全には記述できないとも言われているようです。
ということなので、完璧は望まない前提で取り組むといいようです。

以下に幾つかのサイトからメールアドレスチェックのための正規表現を拾って組み込んでみました。
「ckmail = "〜"」の行をコメントにしたりコメント解除したりしていろんなパターンの正規表現を使ってみてください。
大して変わらないので、引用元URLを読んで好きなものを使ってください。

#include "mod_regexp.as" ; チェックしたいメールアドレス sdim mail, 255, 100 ;-------------------- ; メールアドレスのサンプル ;-------------------- mail(0) = "abc@efg.com" mail(1) = "abc @ efg.jp" ;これはダメな例 mail(2) = "abc@efg.com.hoge" mail(3) = "abc@efg.co.hoge.com" ; http://d.hatena.ne.jp/j0hn/20070602 より 全て正しい mail(4) = "Abc\\@def@example.com" mail(5) = "customer/department=shipping@example.com" mail(6) = "!def!xyz%abc@example.com" ; http://hodade.adam.ne.jp/seiki/page.php?s_mail より 全て正しい mail(7) = "hodade@gmail.com" mail(8) = "store-news@amazon.co.jp" mail(9) = "ranking@emagazine.rakuten.co.jp" mail(10) = "noreply@postmaster.twitter.com" mail(11) = "News_Japan@insideapple.apple.com" mail(12) = "microsoft@e-mail.microsoft.com" mail(13) = "info@dle.jp" ;-------------------- ; チェック用正規表現 ;-------------------- ; 適当版「@」を含めばなんでもいい場合。 ;ckmail = ".*@.*" ; http://phpspot.net/php/pg%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%EF%BC%9A%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%8B%E3%81%A9%E3%81%86%E3%81%8B%E8%AA%BF%E3%81%B9%E3%82%8B.html ;ckmail = "^([a-zA-Z0-9])+([a-zA-Z0-9\\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\\._-]+)+$" ; http://qiita.com/sakuro/items/1eaa307609ceaaf51123 よりHTML5の input[type=email] 相当 ckmail = "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$" ; http://hodade.adam.ne.jp/seiki/page.php?s_mail より ;ckmail = "[\\w\\d_-]+@[\\w\\d_-]+\\.[\\w\\d._-]+" ;簡易 ;ckmail = "^[a-zA-Z0-9!$&*.=^`|~#%'+\\/?_{}-]+@([a-zA-Z0-9_-]+\\.)+[a-zA-Z]{2,4}$" ;厳しめ ; http://emailregex.com/ ;「99%のEmailアドレスにマッチする正規表現」より ;ckmail = "^(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){255,})(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){65,}@)(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22))(?:\\.(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-[a-z0-9]+)*\\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:\\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\\]))$" ;-------------------- ; チェック開始 ;-------------------- repeat 14 ; 正規表現で取り出す前と後が一致していればメールアドレスとして正しい if mail(cnt) = match(mail(cnt), ckmail) { mes "○:" + mail(cnt) } else { mes "×:" + mail(cnt) } loop



可憐

リンク

2015/11/18(Wed) 01:27:22|NO.73093

sakura 様

正規表現は自分にとってとても苦手な分野なのでお勉強になります
ありがとうございます。



GENKI 様

>メールアドレスとして正しいかどうかチェックする正規表現について調べてみると、どこのサイトもそれじゃダメだと罵り合いが行われているようです。


確かにその通りですね^^;
それは承知の上ですが、
GENKI 様にお教え頂いたプログラムでメールアドレスの形式チェックはほぼ完璧に近いと思いますので
使わさせて頂きます!
ありがとうございます。



ONION software Copyright 1997-2021(c) All rights reserved.