javascript - 正则表达式仅在 Safari 上失败
问题描述
我有以下简单的电子邮件验证正则表达式:/(.+){2,}@(.+){2,}\.(.+){2,}/
这在 Firefox、Chrome 等上运行良好,但在 Safari 上失败。
为什么这个完全有效的正则表达式会在 Safari 上失败?我在正则表达式中找不到 Safari 不支持的元素。
/(.+){2,}@(.+){2,}\.(.+){2,}/.test('123@abc.nl');
以上在 Safari 上失败,但在任何其他浏览器上都没有。
解决方案
不同的正则表达式引擎对灾难性回溯倾向模式具有不同的容忍度。
当您使用使匹配两次或更多次(.+)
的量词进行量化时,您的模式是一种灾难性的回溯倾向模式(即,匹配一次或多次两次或更多次,这使得它在不匹配的模式下非常缓慢地失败。){2,}
(.+)
如果您打算匹配任何两个或更多字符,请量化.
模式而不是.+
一个:
/.{2,}@.{2,}\..{2,}/
或者,使用现有的电子邮件验证模式。.
推荐阅读
- c++ - 括号检查器 C++ 程序
- python - 在 Pandas DataFrame 中设置多条件列时出错
- ruby-on-rails - Change the log location (i.e., `LogDevice`) in a Ruby on Rails (version 6) application
- magento2 - 无法验证 composer.json -registration.php 未在自动加载文件指令 Magento 2 中设置
- dart - 启用空安全时,默认的“列表”构造函数不可用。尝试使用列表文字,“List.filled”或“List.generate”
- c# - 如何从挂钩的 c++ 函数调用 c# 委托
- java - Excel 文件将多个零转换为一个
- javascript - 解密不适用于在加密数据上使用解密值查询的记录
- r - 根据 R 中的匹配案例更改列
- firebase - Flutter & Provider:如何让我的 StreamProvider 监听两个不同的值?