正则表达式问题(长字符串)

时间:2019-05-02 11:37:12

标签: javascript regex

我有RegExp条件是/^([0-9]*\.?[0-9])*$/来测试字符串。 我的字符串是1.2.840.346991791506342.1482500253171661(大字符串),第二个是1.2.3.201922311129.10038(短字符串)。

由于两个字符串都正确,因此搜索成功。

但是当我在第二个短字符串的最后一个空格处添加空格时,它表明无效,这是正确的结论。

但是当我在第一个字符串中添加空格时,它应该按照代码显示无效的字符串,但是却被挂起,为什么它显示为挂起?

RegExp限制已用尽?解决办法是什么?

出于测试目的,您可以在记事本+中进行检查,^([0-9]*\.?[0-9])*$直接使用此公式。

1 个答案:

答案 0 :(得分:3)

您编写正则表达式的方式,嵌套量词会导致它进入 catastrophic backtracking 并导致其挂起/超时。

Catastrophic Backtracking Demo

您需要将正则表达式简化为类似的内容,

^[0-9]*(?:\.[0-9]+)*$

让我知道此正则表达式是否保留您的模式。

Regex Demo not running into timeout

通常,您应该避免在正则表达式中嵌套量词,而应尽可能以更简单的方式编写它们。即使对于1.2.840.3469931313.313之类的短字符串,也要查看正则表达式要执行多少步骤,

135228 steps taken

如果您稍微增加字符串长度,则会遇到超时/灾难性的回溯。