我刚刚用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\"[^\"]*"
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句