正则表达式必须做预编译

更新时间:2023-07-28 07:14:10 阅读: 评论:0

艾叶糍粑>品质至上正则表达式必须做预编译
正则表达式必须做预编译
元谷错误案例
现象描述:据校长的观察, 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)) { …… }
}

本文发布于:2023-07-28 07:14:10,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1121380.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:导致   性能   编译
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图