Duv*_*eit 5 java regex optimization
我需要替换不属于HTML实体的字符串中的所有&.因此字符串"This&entites >
&<
"将返回"This &
entites > & <
"
而且我想出了这个正则表达式模式:" &[a-zA-Z0-9] {2,7}; "这很好用.但是我对正则表达式并不是很熟练,当我测试超过100k迭代的速度时,它比先前使用的方法使用了两倍的时间,没有使用正则表达式.(但也不是100%工作).
Testcode:
long time = System.currentTimeMillis();
String reg = "&(?!&#?[a-zA-Z0-9]{2,7};)";
String s="a regex test 1 & 2 1&2 and &_gt; - &_lt;"
for (int i = 0; i < 100000; i++) {test=s.replaceAll(reg, "&");}
System.out.println("Finished in:" + (System.currentTimeMillis() - time) + " milliseconds");
Run Code Online (Sandbox Code Playgroud)
那么问题是,是否有一些明显的方法可以优化这个正则表达式,使其更有效?
s.replaceAll(reg, "&")
每次都在编译正则表达式.一次编译模式将提供一些性能提升(在这种情况下约为30%).
long time = System.currentTimeMillis();
String reg = "&(?!&#?[a-zA-Z0-9]{2,7};)";
Pattern p = Pattern.compile(reg);
String s="a regex test 1 & 2 1&2 and &_gt; - &_lt;";
for (int i = 0; i < 100000; i++) {
String test = p.matcher(s).replaceAll("&");
}
System.out.println("Finished in:" +
(System.currentTimeMillis() - time) + " milliseconds");
Run Code Online (Sandbox Code Playgroud)