正则表达式仅在 Safari 上失败

Posted

技术标签:

【中文标题】正则表达式仅在 Safari 上失败【英文标题】:Regex fails only on 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 真的不喜欢这些群体。 不,不同的正则表达式引擎对灾难性的回溯倾向模式有不同的容忍度。 【参考方案1】:

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

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

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

/.2,@.2,\..2,/

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

【讨论】:

以上是关于正则表达式仅在 Safari 上失败的主要内容,如果未能解决你的问题,请参考以下文章

仅在末尾有空格的字符串的正则表达式模式

如何让这个积极的后向正则表达式在 Safari 中运行

仅在提交时基于正则表达式的验证

正则表达式仅在前面没有时替换

grep及扩展正则表达式

Laravel 验证仅在字段不为空时验证正则表达式