【问题标题】:Is this usage of hyphen in regex valid?在正则表达式中使用连字符是否有效?
【发布时间】:2017-04-03 20:31:48
【问题描述】:

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

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

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

现在,我的一位同事错误地忘记了转义字符,并且 **still* 使它起作用,这让我感到惊讶,因为连字符的间隔含义。看起来像这样。

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

显然,它有效,因为连字符是括号中的最后一个字符。我的问题是,这只是一个巧合还是一个有效的语法?我一辈子都在正则表达式错误吗?

【问题讨论】:

  • 我一辈子都在用正则表达式做错了吗? - 你是在逃避,但这不是

标签: javascript regex email


【解决方案1】:

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

请注意,在某些浏览器中,字符类中任意位置的连字符仍被视为范围元字符,因此最好始终对其进行转义。

引用regular-expressions.info

连字符可以紧跟在左括号之后,也可以紧挨在右括号之前,或者紧跟在否定插入符号之后[-x][x-] 都匹配 x 或连字符。 [^-x][^x-] 匹配任何不是x 或连字符的字符。 在字符类中无法形成范围的其他位置的连字符可能会被解释为文字或错误。正则表达式风格对此非常不一致。

【讨论】:

  • 另外,您可以包含 [#--0] 将匹配的内容。
  • 我理解您所说的,并且可以确认它确实有效。我也可以想象它有时会破裂,为了安全起见应该逃脱。但是,问题是它是否是有效的语法。从定义和学术上讲。
  • @KonradViltersten 这取决于正则表达式引擎如何实现它。它适用于广泛使用的浏览器。
  • 我从未听说过需要在字符类开头转义连字符才能被视为文字的浏览器。你能说出一个吗? Konrad,这是一种完全有效的语法,它的词干符合 POSIX 标准,其中字符类中的字符不能被转义。
  • @WiktorStribiżew 我记错了,但我在 SO 上的帖子中看到了相同的内容,浏览器名称(再次不确定)是 Komodo
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 2017-02-03
  • 2013-08-01
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
相关资源
最近更新 更多