最小化正则表达

时间:2015-09-29 11:56:42

标签: jquery regex

。我需要帮助regExp进行电子邮件验证。我在这个问题上遇到了困难。

要求是: “电子邮件地址的本地部分和域名部分应接受以下内容:

  • 大写和小写拉丁字母(a-z,A-Z)

  • 数字0到9

  • 这些特殊字符:# - _~! $& '* + =和百分位编码即%20

  • 字符。 (点,句号,句号),前提是它不是第一个或最后一个字符,并且也表示它不会连续出现(例如John..Doe @ example.com不允许)。“

我正在验证使用jquery验证器 我得到了反对的表达

 /^[a-z0-9,!#\$%&'\*\+/=\?\^_`\{\|}~-]+(\.[a-z0-9,!#\$%&'\*\+/=\?\^_`\{\|}~-]+)*@[a-z0-9,!#\$%&'\*\+/=\?\^_`\{\|}~-]+(\.[a-z0-9,!#\$%&'\*\+/=\?\^_`\{\|}~-]+)*\.([a-z0-9,!#\$%&'\*\+/=\?\^_`\{\|}~-]{2,})$/

有人可以缩小这个正则表达式

验证

应该有效: him@g#mail.com

不应该工作:他@ g..mail.com

小提琴:http://jsfiddle.net/p6mw3/120/

1 个答案:

答案 0 :(得分:0)

您可以将重复部分声明为构建块,并在构造整个RegExp时重用。另外,我将[a-z0-9_]替换为\w,因为您还需要支持大写拉丁字母(\w = [a-z0-9A-Z_]),并从字符类中删除过多的转义符号。

var rx_block = "[\\w,!#$%&'*+/=?^`{|}~-]"; // <-- REPETITIVE BLOCK
var component = {
    input   : $('input[name="email"]'),
    mensage : {
        fields  : $('.msg'),
        success : $('.success'),
        error   : $('.error')
    }
},
regex = RegExp("^" + rx_block + "+(\\." + rx_block + "+)*@" + rx_block +
     "+(\\." + rx_block + "+)*\\.(" + rx_block + "{2,})$");  // <-- BUILD REGEX DYNAMICALLY WITH REGEXP CONSTRUCTOR

component.input.blur(function () {
    component.mensage.fields.hide();
    regex.test(component.input.val()) ? 
            component.mensage.success.show() : component.mensage.error.show();
});
.msg {
    display: none;
}
.error {
    color: red;
}
.success {
    color: green;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label for="email" id="email">Hey!</label>
<input id="email" name="email" type="email" class="required" /> 
<span class="msg error">You shall not pass!</span>
<span class="msg success">You can pass!</span>