簡體   English   中英

正則表達式Java,為什么此正則表達式這么慢?

[英]Regular Expressions Java, why is this regex so slow?

我剛剛用Java創建了一個正則表達式,我想在大約5000條推文中查找表達式,每條推文幾乎要花一秒鍾,為什么這么慢?

如果該表達式太復雜或執行某項操作的成本太高? 我希望可以在不到5秒的時間內處理整個數據。

代碼是:

public class RegularExpression {
    public static void main(String[] args) throws IOException {                
        String filter = ".*\"created_at\":\"(.*?)\".*\"content\":\"(.*?word.*?)\",\"id\".*";       
        Pattern pattern = Pattern.compile(filter);
        List<String> tweets = FileUtils.readLines(new File("/tmp/tweets"));

        System.out.println("Start with " + tweets.size() );
        int i=0;
        for (String t : tweets){

            Matcher matcher = pattern.matcher(t);                      
            matcher.find();            
            System.out.println(i++);

        }
        System.out.println("End");
    }
}

輸入是JSON tweets。 如果我簡化我的RE,它的運行速度會更快,但是,我認為我的RE並不是那么繁重。 我想了解為什么會這樣,我只是在檢查測試。

更新:

我嘗試解析JSON時使用RE的原因是,最終,我可以從任何類型的服務器中獲取簡單的文本,XML,JSON格式的日志。 因此,我必須像純文本一樣處理我的輸入。

您的正則表達式在允許匹配的內容上非常不精確。 最重要的是,您似乎想在引號之間匹配文本,但是您允許將引號字符作為匹配項的一部分( .*可以並且將愉快地匹配"" 。這使您有可能使用大量的聲明輸入失敗/成功之前,正則表達式引擎必須檢查的排列,具體取決於您的輸入。

如果實際上引號可能不是您當前與.*匹配的文本的一部分,請改用[^"]* ;這樣可以大大提高速度:

"[^\"]*\"created_at\":\"([^\"]*)\"[^\"]*\"content\":\"([^\"]*word[^\"]*)\",\"id\"[^\"]*"

由於您已經知道輸入是JSON,因此不應使用正則表達式來解釋它。 使用JSON解析器,則不必擔心轉義特殊字符之類的事情。

我不完全確定為什么要花幾乎一整秒的時間處理一條推文,但是惰性量詞要比“匹配除”以外的方法匹配到“直到...”的情況更昂貴。

此處的更多信息: http : //blog.stevenlevithan.com/archives/greedy-lazy-performance

您可以嘗試避免使用惰性量詞,或者僅使用JSON解析器,因為它可能更快/更干凈。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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