【问题标题】:Regex fails only on Safari正则表达式仅在 Safari 上失败
【发布时间】:2021-03-05 12:08:12
【问题描述】:

我有以下简单的电子邮件验证正则表达式:/(.+){2,}@(.+){2,}\.(.+){2,}/

这在 Firefox、Chrome 等上运行良好,但在 Safari 上失败。

为什么这个完全有效的正则表达式会在 Safari 上失败?我在正则表达式中找不到 Safari 不支持的元素。

/(.+){2,}@(.+){2,}\.(.+){2,}/.test('123@abc.nl');

以上在 Safari 上失败,但在任何其他浏览器上都没有。

【问题讨论】:

  • 正则表达式很糟糕,你永远不应该这样量化(.+)。应该写成/.{2,}@.{2,}\..{2,}/
  • 尽管如此,Safari和其他浏览器的行为应该不会不一致吧?
  • Safari 真的不喜欢这些群体。
  • 不,不同的正则表达式引擎对灾难性的回溯倾向模式有不同的容忍度。

标签: javascript regex safari backtracking


【解决方案1】:

不同的正则表达式引擎对灾难性回溯倾向模式具有不同的容忍度。

当您使用 {2,} 量化 {2,} 量化 (.+) 时,您的模式是一种灾难性的回溯倾向模式,这使得 (.+) 匹配两次或更多次(即匹配一次或多次两次或更多次,这使得它非常失败慢慢地用不匹配的模式。)

如果您要匹配任何两个或多个字符,请量化 . 模式而不是 .+ 一个:

/.{2,}@.{2,}\..{2,}/

或者,使用现有的email validation patterns.

【讨论】:

    猜你喜欢
    • 2018-04-24
    • 2020-11-21
    • 2019-11-09
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多