2017-03-01 84 views
-3

我使用正则表达式来验证数字格式。我的正则表达式是灾难性的回溯?

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

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

+2

''[0-90-9]'可以更改为'[0-9]' – anubhava

+2

该模式的要求是什么? '[0-90-9]'当然不是这里的主要问题,而是组内嵌套的量词。 –

+0

谢谢,我注意到,但我会很感激,如果有人可以使这个正则表达式回溯infinitely.In这种情况下,我可以肯定这就是问题 –

回答

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. 

会造成灾难性的回溯。

+0

该字符串正常运行:( –

+1

请注意,这只是锚定上下文中的问题,例如'.matches' –

+0

@ SainathS.R然后使其不再 –

0

要验证输入字符串使用这一个:

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

正如我写了一篇评论:

所有捕获组是可选的,其中使用?*,如果你想验证输入,加^...$包装

看看右边的吧https://regex101.com/r/eM7OFj/1标题:比赛信息

+0

谢谢,我知道模式可以更改为更好的东西,但我想知道任何可能导致此模式无限期运行的示例输入。 –

+0

您的模式针对输入文本中的每个字符运行。注意使用^ $ – MohaMad

+0

'测试你的正则表达式'有16个匹配的空字符串@ SainathS.R – MohaMad