0

我的最终正则表达式(更新):

^[A-z0-9]*([\.]?\w*)*[A-z0-9]+@[A-Za-z0-9]([\.]?\w+)+\.[A-Za-z][A-Za-z][A-Za-z]$

第一个问题

我知道方括号[]用于字符集/类,但我不明白为什么它不需要右括号,并导致我的 Reg-ex 行为怪异。例如这里原来是

[A-z0-9]*[\.?[\w+]+[A-z0-9]+@[A-Za-z0-9][\.?[A-Za-z0-9+]+\.[A-Za-z][A-Za-z][A-Za-z]
Matches ----> reg.ex.email@gmail.com

请注意,在第二个[之前的第二个\.以及在第二个之前的第六[\.这两个没有任何右括号。我也知道 ? 表示零个或前面的元素之一。当我删除括号9]*\.?[\w时,正则表达式不会识别reg.字符串的一部分。我也尝试添加右括号[\.?[\w+]], [\.?][\w+],但它也会导致相同的行为,请注意第一个[\.?[\w+]]导致它根本无法识别字符串。任何人都可以帮助解释这种行为吗?

第二个问题

基于上述正则表达式,我使用 JavaScript 正则表达式来测试我的字符串。而且我不知道为什么测试通过了,即使只有部分字符串通过了测试。我的一些测试用例

reg@asld@fja.com
reg.exp.email@gmial@gmail.com
reg.exp.email@gm@il.com
reg.exp.themail@gmail.com

我应该澄清只reg.exp.themail@gmail.com应该通过

如果您访问此站点并通过我的正则表达式和测试字符串,您就会明白我的意思。在我的 javascript 我有这个

var inputVal = $(this).val();       
    var re = /[A-z0-9]*[\.?[\w+]+[A-z0-9]+@[A-Za-z0-9][\.?[A-Za-z0-9+]+\.[A-Za-z][A-Za-z][A-Za-z]/;
    if (!re.test(inputVal)) {
        $("#emailValidate").css({"display": "inline-block", "color":"red","margin-top":"4px"});          
    } else {
        $("#emailValidate").css("display", "none");
    }

上面的测试用例通过了。对这个有任何想法吗?

4

2 回答 2

2

回答第一个问题

在字符类中包含一个左括号[很好,它不会在第一个字符类中创建另一个字符类。这就是为什么接受包含它而不在字符类中转义的原因。

回答第二个问题

您需要将您的模式包含在行首^和行尾$锚点之间,以便它匹配整个输入字符串而不是它的一部分,如下所示:

^[A-z0-9]*[\.?[\w+]+[A-z0-9]+@[A-Za-z0-9][\.?[A-Za-z0-9+]+\.[A-Za-z][A-Za-z][A-Za-z]$
|                                                                                   |
Start-Of-Line                                                             End_Of_Line

正则表达式 101 演示

于 2013-11-05T18:17:36.453 回答
0

我知道它已经被回答了,但是单独 ^$ 并不能回答我所有的问题。2个'['字符仍然没用。例如,正则表达式的第一部分(@ 之前)只允许电子邮件地址中最多有 1 个点,唯一使它与多个点匹配的是额外的“[”,但这不应该有这种效果。我想现在我首先找到了它应该是什么:

^[A-z0-9]*(\.?\w+)+@...

在我看来,当 w 之后的 + 在 [] 而不是 () 内部时,我认为它在原始正则表达式中也没有影响。或者如果杰克只想匹配 2 个点,那么:

^[A-z0-9]*(\.\w+){2}@...

我只是不相信额外的'['和[]里面的'+'使它成为一个可靠的模式。如果我错了,请纠正我的嗅探器。

于 2013-11-05T18:56:02.087 回答