我的正则表达式是灾难性的回溯吗?

Is my regex catastrophically backtracking?

我使用正则表达式来验证数字格式。

[-+]?([0-90-9]+((\,([0-90-9]{2,}))*\,([0-90-9]{3}))*)?(\.[0-90-9]*)? 

当我为某些输入处理大量输入时,它似乎无限循环。我阅读了有关灾难性回溯的其他答案。 但我是正则表达式新手,需要一些帮助。 您能否提供任何可以使此正则表达式灾难性地回溯的输入。对我理解会有所帮助。谢谢。它也可以是一个很长的输入。 我正在使用 Java 模式和匹配器对象。

要验证您的输入字符串,请使用以下字符串:

^[-+]?(\d+((\,(\d{2,}))*\,(\d{3}))*)?(\.\d*)?$

正如我在评论中所写:

all of your capturing groups are optional , where using ? or * and if you want to validate input, add ^...$ wrapper

查看 https://regex101.com/r/eM7OFj/1 的右侧栏,标题为 MATCH INFORMATION

是的,这个正则表达式容易出现灾难性的回溯。具体来说,这个部分:

((\,([0-9]{2,}))*\,([0-9]{3}))*

供参考,其结构形式为

((,d)*,d)*

简化后,本质上是 (d+)*

字符串如

1,111,111,111,111,111,111,111,111,111,111,111,111,111,11.

因此会导致灾难性的回溯。