-3

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

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

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

4

2 回答 2

1

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

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

作为参考,这具有以下形式的结构

((,d)*,d)*

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

像这样的字符串

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

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

于 2017-03-01T12:06:46.933 回答
0

要验证您的输入字符串,请使用这个:

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

正如我在评论中所写:

您所有的捕获组都是可选的,如果使用?or*并且如果您想验证输入,请添加^...$包装器

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

于 2017-03-01T11:58:42.360 回答