我在codeacademy.com上做这个练习,我偶然发现了这个没有任何意义的练习。当我尝试在第一个[]中包含#标签时,它发出错误。我不确定为什么。
//change the regexp to have only good message
var emailregexp = /[a-z0-9._%+-#]+@[a-z0-9.-]+\.[a-z]{2,4}/;
console.log(emailregexp.test("michael.courcy@microsoft.com")?"good":"bad");
console.log(emailregexp.test("michael.courcy@gmail.com")?"good":"bad");
console.log(emailregexp.test("###mic###@microsoft.com")?"good":"bad");
输出
error
答案 0 :(得分:2)
您需要在-
之前转义#
,否则它会认为您要提供范围,例如0-9
:
[a-z0-9._%+\-#]
所以它看起来像:
var emailregexp = /[a-z0-9._%+\-#]+@[a-z0-9.-]+\.[a-z]{2,4}/;
答案 1 :(得分:2)
因为#
不在Unicode表中的+
之后。
+-#
是范围(从+
到#
)。如果您希望短划线成为单独的字符,请使用\-
或将其移至括号的末尾:+#-]
。
答案 2 :(得分:0)
错误是这样的:
SyntaxError:无效的正则表达式: /[a-z0-9._%+-#]+@[a-z0-9.-]+.[a-z]{2,4}/:范围乱序 字符类
问题是#之前的 - (破折号)。 JavaScript正在尝试定义一个范围,其中包含 + (加号)和#之间的所有字符,这些字符无效。
交换 - 和#,如下所示:
var emailregexp = /^[a-z0-9._%+-#]+@[a-z0-9\.-]+\.[a-z]{2,4}$/i;
另请注意开头的插入符号锚点和结尾处的 $ 。这表示内容必须从头到尾匹配,没有 ^ 和 $ ,任何包含电子邮件地址的字符串都将匹配。
您可能希望 i 标志允许使用大写字母。