【问题标题】:Regex - CSV email addresses ok, but how to prevent ending with comma?正则表达式 - CSV 电子邮件地址可以,但如何防止以逗号结尾?
【发布时间】:2019-02-03 23:01:12
【问题描述】:

我正在使用 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,,这是我的问题。

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

【问题讨论】:

标签: jquery regex


【解决方案1】:

让我们分部分进行...首先如何获取有效的域元素。它由字母数字字符串组成,可以在两个字符之间包含连字符,但不能在结尾,也不能重复。这可以用这个正则表达式来完成:

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

你看,因为连字符是可选的,所以没有连字符的字母数字字符串可以有任何长度,它们不能在任何结尾,并且连字符不能重复(连字符总是被字母数字包围。这将形成一个域组件, 让一个或多个域组件用点分隔...我们使用相同的方法并编写:

<EXP>(\.<EXP>)*

&lt;EXP&gt; 是上面的正则表达式。

[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>)*

&lt;EXP&gt; 是上面的表达式:

[^@,\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

看起来很复杂,但你只需要写一次。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    表达式的最后部分是:

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

    请注意,,|, 等同于 , ?(或者更灵活的可能是 ,\s*)。

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

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

    这表示“匹配逗号后跟可选空格,但前提是后面不跟输入结尾”。

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

    【讨论】:

    • 我刚刚了解了自己背后的负面看法。我把结尾改成了(?&lt;!,|, )$
    猜你喜欢
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多