您的位置:首页 > 编程语言 > Java开发

java中使用正则表达式注意事项

2011-07-26 13:17 555 查看
最近,在系统巡查时,发现jboss的消息驱动bean的15个线程均被堵死,不再处理消息,也未报任何异常,cpu也比较高,非常奇怪!
 
经过对日志的仔细分析,发现是所有的线程均停在一处正则表达式的处理语句上,为验证,把相同的输入内容拷贝到本地的测试程序进行验证,果然是用正则表达式匹配这个内容时,进入一种类似死循环的状态:
 
String input = "332#03,09,10,18,24,28+08#08,09,18,24,25,28+10#03.08.10,18,25,28+09#02.08.10.18.25.28.+09#";
  
String regstr1 = "(33|70|50)[1-9]#(\\d{1,2}(\\p{Punct}|\\pP){0,1}){1,70}";
Pattern pMoContent = Pattern.compile(regstr1, Pattern.CASE_INSENSITIVE);  
System.out.println(pMoContent.matcher(input).matches());
 
经过反复测试,发现这个正则表达式在匹配内容中“.+”时,出现异常,进入死循环,更深层次的原因没弄清楚;
 
为了让系统尽快恢复正常并避免类似故障,采取以下方案解决:即在做这个正则表达式匹配前,先对内容进行连续多符号的替换,使内容中不存在有连续多个符号,这样暂时解决了这个问题。
 
事后,在网上查过,看了很多关于正则的评论,其中:
http://blog.csdn.net/shixing_11/article/details/5997567
描述另外一种会出现类似情况的描述,并大致给出了深层次原因:“原来:该问题是JDK的BUG,到JDK1.6里居然还没修复”
总而言之:正则表达式是个双仞剑,如果大规模数据的校验最好不要使用正则,效率非常差。CPU的处理能力会全部耗费在处理这几个正则上。另外该问题是项目上线一段时间后才出现,这说明当数据达到一个数量级后,正则的处理效率会快速下降,这样就像我这种情况,刚开始数据量小,一直没有问题,等到访问量突然增大后,CPU在短时间内LOAD值非常高。所以正则轻易不要用在大数据量或者并发访问较高的应用中。特别是对于较复杂的正则匹配,一定要做好大数据量压力下的效率测试,尽可能避免触犯相关的bug;
 
最后,罗列几个常用中文和全角相关的匹配表达式:
 /**
  * 所有字符:.
  * 中文:[\u4E00-\u9FFF]
  * 数字:\d或[0-9]
  * 字母:[a-z]|[A-Z]
  * 字母+数字+"_":\w
  * 半角标点符号:\p{Punct}
  * 全角标点符合:\pP
  * 空白字符:\s
  * @param args
  */
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息