我的最终正则表达式(已更新):
^[A-z0-9]*([\.]?\w*)*[A-z0-9]+@[A-Za-z0-9]([\.]?\w+)+\.[A-Za-z][A-Za-z][A-Za-z]$
第1个问题
我知道方括号[]
用于字符集/类,但我不明白的是为什么它不需要一个右括号,并导致我的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+]]
会导致它根本不识别字符串。任何人都可以帮助解释这种行为吗?
第二个问题
基于上面的Regex我使用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
应该通过
如果你转到this site并通过我的正则表达式和测试字符串,你可以看到我的意思。在我的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");
}
上面的测试用例通过了。对这一个有任何想法吗?
答案 0 :(得分: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
答案 1 :(得分:0)
我知道它已经回答了,但^ $单独不回答所有我的问题。 2'['字符仍然无用。例如,正则表达式的第一部分(在@之前)仅允许电子邮件地址中最多1个点,并且唯一使其与多个点匹配的是额外的'['但不应该具有此效果。我想现在我发现它本来应该是最初的:
^[A-z0-9]*(\.?\w+)+@...
w之后的+在原来的正则表达式中也没有影响,当它在[]内而不是()如上所述时。 或者如果杰克只希望匹配2个点,那么:
^[A-z0-9]*(\.\w+){2}@...
我只是不相信额外的'['和[+]内部的'+'使它成为可靠的模式。如果我错了,请纠正我的嗅探器。