我使用正则表达式来验证数字格式。
[-+]?([0-90-9]+((\,([0-90-9]{2,}))*\,([0-90-9]{3}))*)?(\.[0-90-9]*)?
当我为某些输入处理大量输入时,它似乎无限循环。我阅读了有关灾难性回溯的其他答案。但我是一个正则表达式新手,需要一些帮助。您能否提供任何可以使这个正则表达式灾难性地回溯的输入。对我理解会有帮助。谢谢。这也可能是一个很长的输入。我正在使用 Java 模式和匹配器对象。
我使用正则表达式来验证数字格式。
[-+]?([0-90-9]+((\,([0-90-9]{2,}))*\,([0-90-9]{3}))*)?(\.[0-90-9]*)?
当我为某些输入处理大量输入时,它似乎无限循环。我阅读了有关灾难性回溯的其他答案。但我是一个正则表达式新手,需要一些帮助。您能否提供任何可以使这个正则表达式灾难性地回溯的输入。对我理解会有帮助。谢谢。这也可能是一个很长的输入。我正在使用 Java 模式和匹配器对象。
是的,这个正则表达式容易发生灾难性的回溯。具体来说,这个部分:
((\,([0-9]{2,}))*\,([0-9]{3}))*
作为参考,这具有以下形式的结构
((,d)*,d)*
简化后,本质上是(d+)*
.
像这样的字符串
1,111,111,111,111,111,111,111,111,111,111,111,111,111,11.
因此将导致灾难性的回溯。
要验证您的输入字符串,请使用这个:
^[-+]?(\d+((\,(\d{2,}))*\,(\d{3}))*)?(\.\d*)?$
正如我在评论中所写:
您所有的捕获组都是可选的,如果使用
?
or*
并且如果您想验证输入,请添加^...$
包装器
查看标题为MATCH INFORMATION的https://regex101.com/r/eM7OFj/1的右侧栏