Javascript 什么是';在这种情况下,正则表达式中的[';(2个问题)

Javascript 什么是';在这种情况下,正则表达式中的[';(2个问题),javascript,regex,Javascript,Regex,我的最终正则表达式(更新): ^[A-z0-9]*([\.]?\w*)*[A-z0-9]+@[A-Za-z0-9]([\.]?\w+)+\.[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 --

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

^[A-z0-9]*([\.]?\w*)*[A-z0-9]+@[A-Za-z0-9]([\.]?\w+)+\.[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
应该通过

如果你经过我的正则表达式和测试字符串,你可以看到我的意思

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");
    }
上面哪个测试用例通过了。对这个有什么想法吗?

回答第一个问题 在字符类中包含一个开括号是可以的,并且它不会在第一个字符类中创建另一个字符类。这就是为什么接受在字符类中包含它而不转义的原因

对第二个问题的答复 您需要将您的模式括在行的开头
^
和行的结尾
$
锚定之间,以便它匹配整个输入字符串,而不是像这样匹配其中的一部分:

^[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

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

^[A-z0-9]*(\.?\w+)+@...
在我看来,w后面的+在原始正则表达式中也没有任何效果,因为它位于[]之内,而不是()之上。 或者如果Jack只想匹配2个点,那么:

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

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

正如嗅探器下面所说,如['正则表达式中直接跟在'?'字符后面的字符被解释为字符文字,而不是特殊字符。你可以在它们前面加一个'\'来说明这一点,它不应该改变行为。ooooooooohhhhhhhhhhhhhh,所以我应该删除
《代码>我认为你在你的第一个regex中做了一个打字。我认为你在你的第一个regex中做了一个打字。我认为你在你的第一个regex中做了一个打字。我认为你在你的第一个regex。我认为你在你的第一个regex中做了一个打字。我认为你在你的第一个regex。我认为你在你在你的第一个regex中做了一个错。<代码>[代码>[a-a-a-z0-z0-z0-z0-z0-z0-9-9-9-9-9[[[[[[[[[[[10......]???\w+....]?\w+++++[a-鉴于鉴于鉴于鉴于鉴于鉴于鉴于鉴于[a-z0-z0-10-10-10-10-10-10-10-10-9]-9]-9]鉴于鉴于鉴于鉴于鉴于鉴于鉴于
但也可以是
[a-z0-9]*[.]?[\w+]+[a-z0-9]+@[a-Za-z0-9][.]?[A-Za-z0-9+][.][A-Za-z]{3}
好的,显然使用该网站不起作用,但将其添加到我的java脚本中起作用。@JackThor一切正常,请查看我在答案末尾发布的演示链接。感谢您接受。哇,该网站比我找到的网站好得多。很好。请竖起大拇指,点击这个很棒的链接。请记住,java Regex要求您使用它在字符类中打开方括号,如
\[
-这是为那些认为这个答案适用于所有正则表达式风格的人准备的…@code Jockey-更重要的是,这是因为Java使用了平衡方括号,因为它允许嵌套类,并且在类内部有特殊的meta char。是的,我遇到了一些问题。根据Sniffer给我的答案和链接,我能够为了制作更好的正则表达式,请参见上面的编辑。