正则表达式-可以使用CSV电子邮件地址,但是如何防止以逗号结尾?

时间:2019-02-03 23:01:13

标签: jquery regex

我正在使用jQuery .validate插件。我写了一个自定义规则,允许使用逗号分隔的电子邮件地址,如下所示:

$.validator.addMethod('csvEmail', function (value, element) {
            return this.optional(element) || /^((([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))+(,|, |$))*$/.test(value);
        }, "Please enter a valid email address or multiple valid addresses separated by a comma.");

这适用于test@test.com, example@test.com,并且在中间没有空格的情况下也是如此。

但这是我受困的地方,因为它也适用于test@test.com,,这是我的问题。

正则表达式的哪一部分需要更改以禁止以逗号结尾的有效电子邮件地址?

2 个答案:

答案 0 :(得分:1)

让我们按部就班...首先是如何获取有效的域元素。它由字母数字字符串组成,可以在两个字符之间包含连字符,但不能在末尾包含连字符,也不能重复。这可以通过此正则表达式完成:

[a-zA-Z0-9](-?[a-zA-Z0-9])*

您会看到,因为连字符是可选的,所以不能将不带连字符的字母数字字符串设置为任意长度,它们不能位于任何末端,也不能重复连字符(连字符始终被字母数字包围。这将形成域部分) ,以一个或多个用点分隔的域组件...我们使用相同的方法并编写:

<EXP>(\.<EXP>)*

其中<EXP>是上面的正则表达式。

[a-zA-Z0-9](-?[a-zA-Z0-9])*(\.[a-zA-Z0-9](-?[a-zA-Z0-9])*)*

这将与电子邮件地址的域部分匹配。为了构成其余部分,我们允许使用任何字符(@,除外),因为它们用于分隔组件:

[^@,\s]+

所以我们的正则表达式会导致:

[^@,\s]+@[a-zA-Z0-9](-?[a-zA-Z0-9])*(\.[a-zA-Z0-9](-?[a-zA-Z0-9])*)*

然后我们可以重复这些,并用\s*,\s*(逗号分隔,并用任意数量的空格隔开)分隔:

<EXP>(\s*,\s*<EXP>)*

其中<EXP>是上面的表达式:

[^@,\s]+@[a-zA-Z0-9](-?[a-zA-Z0-9])*(\.[a-zA-Z0-9](-?[a-zA-Z0-9])*)*(\s*,\s*[^@,\s]+@[a-zA-Z0-9](-?[a-zA-Z0-9])*(\.[a-zA-Z0-9](-?[a-zA-Z0-9])*)*)*

将是一个可以解析所有内容的表达式。有关其工作原理的示例,请参见demo

这似乎很复杂,但是您只需编写一次即可。

希望这会有所帮助。

答案 1 :(得分:0)

表达式的最后一部分是:

)+(,|, |$))*$

请注意,,|,等效于, ?(或者也许更灵活,\s*)。

防止尾随逗号的一种方法是使用负前瞻:

)+(,\s?(?!$)|$))*$

这是“匹配逗号,后跟可选空格,但前提是不加空格,然后再输入”。

更普通的做事方式是使用不同的结构A(BA)*而不是(A(B|$))*,但显然重复在这里容易出错!