正则表达式中连字符的这种用法是否有效?

时间:2016-04-29 13:34:40

标签: javascript regex email

NB。我想知道它是否是正则表达式定义中未转义的连字符的有效应用程序。关于匹配电子邮件,连字符的含义,反斜杠,量词或其他任何内容的问题 。此外,请注意链接的答案并未真正讨论转义/未转义连字符之间的有效性问题。

通常我会声明正则表达式匹配这样的电子邮件地址。

var emailPattern = /^[a-z.\-_]+@[a-z]+[.]{1}[a-z]{2,3}$/;
emailPattern.test('ss.a_a-@ass.com');

现在,我的一位同事错误地忘记了逃脱角色,**仍然*让它起作用,这让我感到惊讶,因为连字符的间隔意义。它看起来像这样。

var weirdPattern = /^[a-z._-]+@[a-z]+[.]{1}[a-z]{2,3}$/;
weirdPattern.test('ss.a_a-@ass.com');

显然,它起作用,因为连字符是括号中的最后一个字符。我的问题是,如果这只是一个快乐的巧合,或者它是否是一个有效的语法?我一生都错了吗?

1 个答案:

答案 0 :(得分:4)

字符类中的连字符用于范围。但是,当在字符类的开头或结尾放置时,不需要转义它。

请注意,在某些浏览器中,字符类中任何位置的连字符仍被视为范围元字符,因此最佳做法是始终将其转义。

引自regular-expressions.info

  

连字符可以在开始括号之后,或在右括号之前,或在否定插入符之后之后。 [-x][x-]都匹配x或连字符。 [^-x][^x-]匹配任何不是x或连字符的字符。 字符类别中其他位置的连字符(它们不能形成范围)可能会被解释为文字或错误。正则表达式对此非常不一致。