首页 > 解决方案 > 正则表达式仅在 Safari 上失败

问题描述

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

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

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

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

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

标签: javascriptregexsafaribacktracking

解决方案


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

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

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

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

或者,使用现有的电子邮件验证模式。.


推荐阅读