gpt4 book ai didi

javascript - Jquery .replace 使浏览器崩溃

转载 作者:行者123 更新时间:2023-11-28 13:36:50 25 4
gpt4 key购买 nike

这行代码(我相信)查找以 foo 开头并以 bar 结尾的子字符串,其中包含任何内容(包括换行符),并将其从字符串中删除。

zip = string.replace(/foo(.|\s)*bar/, '');

出于某种原因,当我在其中放入一个非常大的字符串时,其中很大一部分不在 foo 和 bar 之间,它会使 Chrome 崩溃。 Chrome 不显示任何错误消息,控制台也不显示,但选项卡卡住,除了关闭之外拒绝执行任何操作。

外部内容相对较小时,不会崩溃,而 foo 和 bar 内部内容较多时,不会崩溃。这并不是因为字符串太大,JS 对字符串没有限制,并且其他 .replace 函数也可以处理相同大小的字符串。可能是正则表达式写得不好还是什么?

最佳答案

浏览器因正则表达式 /foo(.|\s)*bar/ 崩溃,而 /foo[\s\S]*bar/ 则不然由于回溯 hell ,皮特建议。

(未优化的)NFA 正则表达式引擎将尝试第一个分支,如果匹配失败,它将回溯到第二个分支。更好的引擎会分析语法,将.\s组合成一个字符类,这样就不会浪费时间回溯。

让我们考虑这个输入:

foo           notba     other

对于正则表达式 /foo(.|\s)*bar/,因为空格 (ASCII 32) 可以匹配 .\s,在.分支匹配失败后,会尝试\s分支:

foo           notba     other
^^^^^^^^^^^ ^^^^^

空格字符的数量是正则表达式引擎探索的二叉树的层数。如果字符串包含 foo 但不包含 bar,时间复杂度会随着空白字符的数量呈指数增长。

考虑pete的修改/foo[\s\S]*bar/,没有分支,因为所有内容都已由字符类检查过,所以当我们失败时回溯时,我们不会'没有任何未探索的分支,将很快返回失败。

关于javascript - Jquery .replace 使浏览器崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20778196/

25 4 0
文章推荐: css - HTML5 将图像放在屏幕上我想要的位置
文章推荐: css - 当你不能使用位置 :relative and position:absolute 时如何将

float 到

Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com