艾叶糍粑>品质至上正则表达式必须做预编译
正则表达式必须做预编译
元谷错误案例
现象描述:据校长的观察, Java5的正则表达式的实现可能会导致JVM的崩溃;在递归处理上性能极度低下
错误分析
错误原因: 1、Java5 ⾃⾝带的实现,没有执⾏事实上perl标准,导致很多书写⽅式上和perl的表达不⼀样, 导致学习成本⾼ 2、已经明确的观察到,Java5的实现可能会导致JVM的崩溃。 3、在深度递归处理下性能很差 4、正则表达式在运⾏期编译很耗费性能,我们可以看Perl5Compiler().compile⽅法有差不多200⾏的代码,都是在做编译⼯作。
老黄狗以下是⼀个错误的例⼦:每次需要⽤正则去匹配的时候,都需要把pattern编译⼀遍,导致性能低下
private static final String LOGINID_REGEX = "^[a-zA-Z]+[a-zA-Z0-9]+";
....皮鞋能用水洗吗>婚前协议
if (!pile(LOGINID_REGEX).matcher(resultStr).find()) {
...
}
正确⽤法
正确⽤法: 1. 建议使⽤ORO库来处理这类问题。 2. 不要使⽤⼤规模长度的表达式, ⽐如根据配置⽂件的字符串, 拼接成⼀个⾮常长的表达式。 这个会导致匹配性能⾮常的低下。 3. 表达式⼀定要求是预先编译的, 这个编译过程是⾮常具有消耗性能的。 4. 如果⼀些是⾮频繁的使⽤的表达预先编译可能在代码的处理上会有点⿇烦, 不过, ORO提供给我们⼀个⽐较好的util实现:Perl5Util, 他能在cache住⼀些经常被使⽤的表达式。 不过⼤约就是20个样⼦。
如何策划活动private final static Pattern pattern = new Perl5Compiler().compile("^\\d+$", '''Perl5Compiler.READ_ONLY_MASK''');
复活英文//请注意,由于Pattern本⾝不是线程安全的,只有加了READ_ONLY_MASK的编译参数才能⽤于共享使⽤,否则会出现并发访问的问题,导致错误结果
public void mach(){
PatternMatcher matcher = new Perl5Matcher();
if (matcher.matches(str, pattern)) { …… }
}