簡體   English   中英

正則表達式占用太多時間和內存

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM