正则表达式的效率比String.split更低吗? 正则表达式java 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 其实,split函数实现用的也是正则所以我认为是所写的正则计算的复杂度问题而已。你的第一个正则表达式是"(.* )*" + s2 + "( .*)*",一堆的 星星(星号)和月亮(括号),必须快不起来。第二个正则表达式是" ",只有一个空格,必须很快。 对啊,我也感觉split的实质也是正则,所以不是正则不行,是我不会用请问,这个函数的正则要如何写,才能达到不低于split的性能?我猜测split的内部可能有一个缓存机制,我第一次调用split(" ")的时候,他就在内部把他的_pattern缓存起来,这样就不用每次都compile猜的而已,如果是这样的话,这个机制我自己也可以实现,但是性能方面最多和split持平,而且显然不如直接调split来得方便请问你怎么看? 这个函数是我用来解析html中节点的class属性时,加载到xpath库中的自定义函数在我的系统中调用会非常频繁,预计每秒调用次数至少是好几千次所以我必须十分关注性能 性能的话,直接String操作更快: public static boolean useIndexOf(String s1, String s2) { int length1 = s1.length(); int length2 = s2.length(); int limit = length1 - length2; char last = ' '; for (int i = 0; i <= limit; i++) { if (last == ' ' // 左 && (i == limit || s1.charAt(i + length2) == ' ') // 右 && s1.regionMatches(i, s2, 0, length2)) { return true; } last = s1.charAt(i); } return false; } 另外,实际上,class未必全是空格,制表符之类的,都可以 4楼的方案确实是比较复杂,但是运行了一下,也确实非常快。100w次调用只要60ms结贴了 我的看法一楼已经写了,实际上就是你所编写正则的运算复杂度(与“我猜测split的内部可能有一个缓存机制”无关):—— 第一个正则表达式是"(.* )*" + s2 + "( .*)*",一堆的 星星(星号)和月亮(括号),必须快不起来。—— 第二个正则表达式是" ",只有一个空格,必须很快。通配符“.”和匹配搜索“*”都是很消耗计算量的,而且往往存在大量回溯操作(匹配失败后要回头再从第二个进行尝试),总的来说,可以认为是正则使用不当。 Jena读取rdf文件的问题 JAVA 里用schema验证xml报错什么原因啊???????????? 关于binarysearch(); 不用odbc如何用JAVA来连接Access数据库(急)谢谢 applet刷新问题 关于时间问题,高手请赐教,线上等,急!!!!!100 如何另存为PDF文件呢 java 帮助文档??WHERE?? 请问spring如何调用oracle函数,帮忙看一下这样行吗 继承问题 关于多线程的问题 这个java程序,怎么写?求教。急急。
你的第一个正则表达式是"(.* )*" + s2 + "( .*)*",一堆的 星星(星号)和月亮(括号),必须快不起来。
第二个正则表达式是" ",只有一个空格,必须很快。
不是正则不行,是我不会用
请问,这个函数的正则要如何写,才能达到不低于split的性能?我猜测split的内部可能有一个缓存机制,我第一次调用split(" ")的时候,他就在内部把他的_pattern缓存起来,这样就不用每次都compile
猜的而已,如果是这样的话,这个机制我自己也可以实现,但是性能方面最多和split持平,而且显然不如直接调split来得方便
请问你怎么看?
在我的系统中调用会非常频繁,预计每秒调用次数至少是好几千次
所以我必须十分关注性能
int length1 = s1.length();
int length2 = s2.length();
int limit = length1 - length2;
char last = ' ';
for (int i = 0; i <= limit; i++) {
if (last == ' ' // 左
&& (i == limit || s1.charAt(i + length2) == ' ') // 右
&& s1.regionMatches(i, s2, 0, length2)) {
return true;
}
last = s1.charAt(i);
}
return false;
}
但是运行了一下,也确实非常快。100w次调用只要60ms
结贴了
我的看法一楼已经写了,实际上就是你所编写正则的运算复杂度(与“我猜测split的内部可能有一个缓存机制”无关):
—— 第一个正则表达式是"(.* )*" + s2 + "( .*)*",一堆的 星星(星号)和月亮(括号),必须快不起来。
—— 第二个正则表达式是" ",只有一个空格,必须很快。
通配符“.”和匹配搜索“*”都是很消耗计算量的,而且往往存在大量回溯操作(匹配失败后要回头再从第二个进行尝试),总的来说,可以认为是正则使用不当。