繁体   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