【问题标题】:Why and I getting: "Invalid regular expression. Uncaught SyntaxError. Invalid escape."?为什么我得到:“无效的正则表达式。未捕获的 SyntaxError。无效的转义。”?
【发布时间】:2016-11-21 15:30:37
【问题描述】:

我正在尝试创建一个 html 输入标记,它只接受以 2 种格式中的 1 种格式输入的数字,并拒绝所有其他输入。

我只想接受这些格式的数字,包括需要破折号:

1234-12

1234-12-12

注意:这不是日期,而是法律章节编号

我读到的关于正则表达式的所有内容都表明以下内容应该有效,但事实并非如此。

<input class="form-control"
                       type="text"
                       pattern="^(\d{4}\-\d{2}\-\d{2})|(\d{4}\-\d{2})$"
                       required />

Chrome 中的 Devtools 控制台错误:

模式属性值^(\d{4}\-\d{2}\-\d{2})|(\d{4}\-\d{2})$ 不是有效的正则表达式:未捕获的语法错误:无效的正则表达式:/^(\d{4}-\d{2}-\d{2})|(\d{4 }-\d{2})$/: 无效转义

【问题讨论】:

  • \- 替换为-
  • 您收到“无效转义”,因为您的正则表达式中有无效转义。在字符类 ([]) 之外,- 没有特殊含义。所以\- 是无效的转义。
  • @T.J.Crowder:我认为这里令人困惑的部分是 /\-/ 是 JS 中的合法正则表达式,而 /\-/u 不是。通常(即几乎无处不在)身份转义不是错误,而是允许的,尽管严格来说不是必需的。

标签: regex syntax-error


【解决方案1】:

您不应该转义与u 标志一起使用的ES6 正则表达式中字符类之外的连字符(在当前版本的Chrome 和FF 中pattern 正则表达式中默认使用的连字符) .

另外,模式属性中的正则表达式默认锚定,删除多余的^$并使用可选组缩短模式

pattern="\d{4}-\d{2}(-\d{2})?"

HTML5 pattern 属性中的这个正则表达式意味着:

  • \d{4}-\d{2} - 匹配 4 位数字,-,然后是字符串开头的 2 位数字
  • (-\d{2})? - 并且可以选择匹配 - 和字符串末尾的 2 位数字。

【讨论】:

  • 我添加了说明:在字符类中,即使在带有 u 修饰符的 ES6 正则表达式中,连字符也可以转义,因为在字符类中,- 可能有特殊含义。
  • 哦,是的,当然,我以前不知道这一点。再次感谢您!
猜你喜欢
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 2020-05-01
相关资源
最近更新 更多