【发布时间】:2021-01-08 19:12:18
【问题描述】:
如果完成时间超过 10 秒,是否可以取消 regex.match 操作?
我正在使用一个巨大的正则表达式来匹配特定的文本,有时可能会起作用,有时可能会失败......
正则表达式:MINISTÉRIO(?:[^P]*(?:P(?!ÁG\s:\s\d+\/\d+)[^P]*)(?:[\s\S]*?))PÁG\s:\s+\d+\/(\d+)\b(?:\D*(?:(?!\1\/\1)\d\D*)*)\1\/\1(?:[^Z]*(?:Z(?!6:\s\d+)[^Z]*)(?:[\s\S]*?))Z6:\s+\d+
工作示例:https://regex101.com/r/kU6rS5/1
所以.. 如果需要超过 10 秒,我想取消操作。可能吗?我没有在 sof 中找到任何相关的内容
谢谢。
【问题讨论】:
-
Ummmmmm...你到底想在这里匹配什么?
-
在 regex101 上它说:“脚本已停止执行,因为它超过了 2 秒的最大执行时间。当您的表达式导致所谓的灾难性回溯时,可能会发生这种情况。我已停止执行为您服务,并在您修改表达式或匹配字符串后恢复它。” regular-expressions.info/catastrophic.html - 如果需要太多时间,您无法停止 regex.match,我认为您需要重新评估您的正则表达式。
-
嗯,这就是在我的应用程序中工作的原因。但是,仍然......需要 3 分钟才能完成......我想取消以避免阻塞我的服务器......
-
关键是上面的表达式写得不好:1)
(?:[\s\S]*?)必须删除,因为它们甚至不应该在那里,在非捕获组上使用*量词要正确展开惰性点匹配模式(这里有 2 个),2)第二个展开的模式没有意义,您可以使用[\s\S]*?,3)应删除最终的子模式(在负前瞻中)量词以便更快地匹配。 -
这是正确的正则表达式,但仍然会很慢,因为输入很大并且有很多
P和Z并且模式本身很长:MINISTÉRIO(?:[^P]*(?:P(?!ÁG\s:\s\d+\/\d)[^P]*)*)PÁG\s:\s+\d+\/(\d+)\b[\s\S]*?\1\/\1[^Z]*(?:Z(?!6:\s\d)[^Z]*)*Z6:\s+\d+。
标签: javascript regex node.js