Java regex正则表达式类似死循环问题



Java regex正则表达式类似死循环问题,详见:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6988218
这个问题其实是由于正则表达式很复杂时,java regex复杂度过高(复杂度成指数级),导致类似死循环的问题。


测试代码:
//

public static void main(String[] args) {
		long begin = System.currentTimeMillis();
		System.out.println("begin!");
		//Pattern pattern = Pattern.compile("^([+-]?((0[xX](\\p{XDigit}+))|(((\\p{Digit}+)(\\.)?((\\p{Digit}+)?)([eE][+-]?(\\p{Digit}+))?)|(\\.((\\p{Digit}+))([eE][+-]?(\\p{Digit}+))?)))|[n|N]?'([^']*(?:'')*[^']*)*')");
		//可以简化成下面这样的,注意  \p、XDigit、Digit之类的是java regex才有的语法
		Pattern pattern = Pattern.compile("^('([^']*(?:'')*[^']*)*')");
	    Matcher matcher = pattern.matcher("'%)) order by ANGEBOT.ID");
	    System.out.println(matcher.find());
	    
	    long end = System.currentTimeMillis();
	    System.out.println((end-begin)/1000+"s used!");
	    System.out.println("finished!");
	}


//


考虑解决方案:

1. native调用c++方法

2. 调用python或perl代码(exec调用方式,linux开一个进程去执行,这样效率可想而知。。。)

3.考虑优化正则表达式(事后证明是最有效的解决方案,哈哈


测试用例:

尝试了几种方法,下面的我测试的一些结论,用下面的2组字符串来测试:

第1组:
text="'%)) order by ANGEBOT.ID";  
regex ="^('([^']*(?:'')*[^']*)*')";  


第2组:
text = "%)) ERROR: JDWP Unable to 2";
regex = "([^']*)*'";



测试结果:

java:2个例子都会跑死。。。超过3天,执行时间跟text字符串的长度基本上成指数级增长
python:2个例子都会跑死。。。超过3天,而且python更慢
c++11:用Microsoft Visual Studio 2010, 2个例子瞬间跑完(<10ms),可惜最新的g++4.7都还没有完全实现regex模块功能...
c++ boost:2个例子,regex库跑会内存栈溢出。。。
perl:2个例子瞬间跑完(<10ms)
c pcre/c++ pcre++:2个例子瞬间跑完(<10ms)





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值