【发布时间】:2010-10-11 22:53:51
【问题描述】:
我正在尝试使用 Java 解析带有正则表达式的链接。
但我认为它变得太慢了。例如,要从以下位置提取所有链接:
...它花费了 34642 毫秒(34 秒!!!)
这是正则表达式:
private final String regexp = "<a.*?\\shref\\s*=\\s*([\\\"\\']*)(.*?)([\\\"\\'\\s].*?>|>)";
模式的标志:
private static final int flags = Pattern.CASE_INSENSITIVE | Pattern.DOTALL |Pattern.MULTILINE | Pattern.UNICODE_CASE | Pattern.CANON_EQ;
而代码可能是这样的:
private void processURL(URL url){
URLConnection connection;
Pattern pattern = Pattern.compile(regexp, flags);
try {
connection = url.openConnection();
InputStream in = connection.getInputStream();
BufferedReader bf = new BufferedReader(new InputStreamReader(in));
String html = new String();
String line = bf.readLine();
while(line!=null){
html += line;
line = bf.readLine();
}
bf.close();
Matcher matcher = pattern.matcher(html);
while (matcher.find()) {
System.out.println(matcher.group(2));
}
} catch (Exception e){
}
}
你能给我一个提示吗?
额外数据:
1Mbit
酷睿 2 双核
1Gb 内存
单线程
【问题讨论】:
-
正则表达式在抓取网站!糟糕的糟糕的选择!
-
如果您先下载整个页面,然后运行您的正则表达式,它会运行得更快吗?您确定是正则表达式花费了这么长时间而不是增量下载吗?
-
是的 Steven,这是正则表达式的东西。我正在使用不同的解析器进行一些分析。
-
This answer 也回答了这个问题。
标签: java regex performance profiling benchmarking