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)





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章