[英]RegEx taking too much time and memory
我有這個RegEx模式
^(\\d|\\w)+\\..*
這是我的意見
(1) nu11111111111111
(2) nu1111111111111111111
(3) nu1111111111111111111111111111111111111
輸入2花費的時間大於輸入1的時間,並且返回不匹配的結果。 但是對於輸入3,即使執行了30分鍾,我也沒有得到任何響應。 我也在觀察內存,並且它不斷增加。
以下是我的代碼段:
String input1 = "nu11111111111111";
String input2 = "nu1111111111111111111";
String input3 = "nu1111111111111111111111111111111111111";
try
{
if (input3.matches("^(\\d|\\w)+\\..*"))
{
System.out.println("Matched");
}
else
{
System.out.println("Not Matched");
}
}
catch (Exception e)
{
e.printStackTrace();
}
這是災難性回溯的另一種情況,因為\\d
已包含在\\w
。 由於找不到匹配項,因此正則表達式引擎會嘗試回溯匹配\\w
或\\d
與您的1
s系列的每種可能組合-這很多。
要對正在發生的事情有一些了解,請訪問https://regex101.com/r/4fRRpc/1/並轉到regex調試器。 這使用了沒有啟動優化的PCRE模式,這應該與Java在這種情況下看起來很相似。
對於您的正則表達式,請改用^\\\\w+\\\\..*
。
那個Java regex引擎是可悲的。
› time perl -E'say /^(\d|\w)+\..*/ ? "Matched" : "Not Matched" for qw(nu11111111111111 nu1111111111111111111 nu1111111111111111111111111111111111111)'
Not Matched
Not Matched
Not Matched
real 0m0,009s
user 0m0,006s
sys 0m0,003s
嘗試RE2 ,它不會回溯並且具有Java綁定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.