2017-03-01 43 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