1

コンマ区切りのリストに入力されるいくつかの形式 (以下を参照) の整形式の電子メールを受け入れる正規表現が必要です。私は基本的な電子メールアドレス検証正規表現を持っています。

^[\w\d._%+-]+@(?:[\w\d-]+\.)+(\w{2,})(,|$) 

これはテスト ケースABを処理できますが、その他は処理できません。私も試しました

^(\<)?[\w\d._%+-]+@(?:[\w\d-]+\.)+(\w{2,})(\>)?(,|$)

これはAB、およびCを処理できましたが、テスト ケースDおよびEのそれぞれで最初の電子メール アドレスのみを検証しました。format 3の正規表現をテストすることすらできていません。

tl;drメールアドレス12、および3を検証する正規表現が必要です。

正規表現をテストするのに適した Web サイト: Online Javascript Regex Tester

データ

テストケース
A. nora@example.com
B. nora@example.com, fred@example.com
C. <nora@example.com>, fred@example.com
D. <nora@example.com>, <fred@example.com>
E. fred@example.com,<nora@example.com>

電子メール アドレスの形式
1. xyz@example.com
2. <xyz@example.com>
3. "xyz"<xyz@example.com>

編集

私はこれを次の重複の可能性としてフラグを立てました:

JavaScript で電子メール アドレスを検証しますか?

これは、次の複製のようです。

正規表現を使用して電子メール アドレスを検証する

どちらも、電子メール検証としての正規表現の有効性に関する多くの議論が含まれています。ただし、提供された上位投票の正規表現は、私が望むことをまったくしていないように見えるため、これはまだ回答されているとは考えていません。

4

4 に答える 4

2

提供されたリンクや回答は、この質問に対する最良の回答ではありませんでした。それを解決したのは次のとおりです。

/*
* regex checks: must start with the beginning of a word or a left caret
* must end with either the end of a word or a right caret
* can handle example.example.com as possible domain
* email username can have + - _ and .
* not case sensitive
*/
var EMAIL_REGEX = /(\<|^)[\w\d._%+-]+@(?:[\w\d-]+\.)+(\w{2,})(\>|$)/i;  
var emails = emailList.trim().split(',');  
var validEmails = [];  
var invalidEmails = [];  

for (var i = 0; i < emails.length; i++) {  
    var current = emails[i].trim();
    if(current !== "") {
        //if something matching the regex can be found in the string
        if(current.search(EMAIL_REGEX) !== -1) {
            //check if it has either a front or back bracket
            if(current.indexOf("<") > -1 || current.indexOf(">") > -1) {
                //if it has both, find the email address in the string
                if(current.indexOf("<") > -1 && current.indexOf(">") > -1) {
                    current = current.substr(current.indexOf("<")+1, current.indexOf(">")-current.indexOf("<") -1);
                } 
            } 
        }
        if(EMAIL_REGEX.test(current)) {
            validEmails.push(current);
        } else {
            invalidEmails.push(current);
        }
    }               
}
于 2012-06-20T18:02:28.703 に答える
1

最初にコンマ区切りのリストを配列に分割し、配列の各メンバーを個別に検証する方が簡単です。これにより、正規表現の記述(および読み取りと保守)が容易になり、リストに入力したユーザーに特定のフィードバックを提供できるようになります(「3番目の電子メールアドレスが無効です」)。

だからあなたが分割でそれをしたと仮定すると

var bits = csv.split(',');

bits配列を反復処理します

for (var i = 0; i < bits.length; ++i) {
  if (!validateEmail(bits[i])) {
    alert("Email #" + (i+1) + " is bogus");
  }
}

次に、正規表現の場合、このようなものは2と3をキャプチャします

(\"[a-z0-9\s]+\"\s+)?\<[\w\d._%+-]+@(?:[\w\d-]+\.)+(\w{2,})\>

<また、単純なものを使用して、前に引用符で囲まれた名前や名前がない単純な電子メールアドレスをキャプチャできます。

単一の正規表現は、必ずしも2つのテストよりも速く実行されるとは限りません。特に、可能性の高いものを最初に配置してif短絡した場合はなおさらです。orまた、読みやすく、維持するのも困難です。最後に、先読みが必要なため、非常に注意が必要です。ファイナル>は、メールアドレスの前の文字列にメール<の最初の文字の直前が含まれている場合にのみ問題ありません。

だから私の0.02ドル=それだけの価値はありません。2つの正規表現を実行するだけです。

于 2012-06-20T00:49:59.170 に答える
1

この validateEmail 関数は、電子メール アドレス ( ) の基本的な構文をチェックしますxyz@example.com。含まれifている は、代替フォーマット ( <xyz@example.com>, 'xyz' <xyz@example.com>) をチェックし、実際の電子メール部分のみを検証します。< または > のみのアイテムは、形式が不適切なため無効と見なされます( )。Nope@example.com>必要な基本構造が欠けている電子メールと同じです ( invalidExample.com)。

var emailList = "abc@example.com,<lmn@example.com>,'xyz' <xyz@example.com>,invalidExample.com,Nope@example.com>,'Still93e-=48%5922=2 Good' <xyz@example.com>";
var emails = emailList.split(",");

//Loop through the array of emails
for (var i = 0; i < emails.length; i++) {
    var isValid = 1;
    var cur = emails[i];

    // If it has a < or a >,
    if( cur.indexOf("<") > -1 || cur.indexOf(">") > -1 ){
        // Set it invalid
        isValid = 0;
        // But if it has both < and >
        if( cur.indexOf("<") > -1 && cur.indexOf(">") > -1 ){
            //Set it valid and set the cur email to the content between < and >
            isValid = 1;
            cur = cur.substr(cur.indexOf("<")+1, ( cur.indexOf(">") - cur.indexOf("<") - 1 ));
        }
    }
    //Run the validate function
    if ( !validateEmail(cur) )
        isValid = 0;

    // Output your results. valid = 1, not valid = 0
    alert("Orig: "+emails[i] +"\nStripped: "+cur+"\nIs Valid: "+isValid);

}

function validateEmail(curEmail){
    var emailValid = /.*\@.*\..*$/g;
    return (curEmail.test(emailValid));
}

jsフィドル

于 2012-06-20T02:01:41.837 に答える
0

このようなものは役に立ちますか?

2.3.をテストしましたが、両方のパターンを検出します。

var isEmail_re       = /^\s*[\w\-\+_]+(\.[\w\-\+_]+)*\@[\w\-\+_]+\.[\w\-\+_]+(\.[\w\-\+_]+)*\s*$/;

function isEmail (s) {
   return String(s).search (isEmail_re) != -1;
}

alert(isEmail ('"xyz"<xyz@example.com>'));

http://jsfiddle.net/epinapala/BfKrR/

于 2012-06-20T00:47:02.490 に答える