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 = "([^']*)*'";