Exception in thread "main" java.lang.StackOverflowError
at java.lang.Character.codePointAt(Character.java:2335)
at java.util.regex.Pattern$CharProperty.match(Pattern.java:3344)
at java.util.regex.Pattern$Branch.match(Pattern.java:4114)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$LazyLoop.match(Pattern.java:4357)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$BranchConn.match(Pattern.java:4078)
類似于以上異常,源自于正則匹配需要不斷地遞歸字符串。當字符串遞歸超過800+,具體數(shù)字忘記了,就會出現(xiàn)堆棧溢出。
我在實際應用的場景是,匹配一個網(wǎng)頁尋求《div》《/div》 之間的內容。當div 之間字符達到了950的時候這時候產(chǎn)生了 類似以上的錯誤。
經(jīng)過分析,和網(wǎng)友遇到的類似問題貼http://topic.csdn.net/u/20110303/10/6a7dce52-481b-430a-b442-98099e9a01c9.html
得出以下不完全正確的解析方案
在正則表達式匹配時對字符個數(shù)進行限制 如:"<div>(.*?|\n*|\r*)*</div> 變成了 <div>(.*?|\n*|\r*){0,700}</div> 這樣達到了限制字符的作用。
但是當解析到此條目時速度仍然非常慢。
如果您有更好的解決方案請您聯(lián)系我。
歡迎轉帖。轉帖請標注出處,以更好的和大家探討解決問題。
——————————————————————————————————————
Lancelot 提出的正則<div[^>]*>([\s\S]*?)</div> 或<div>([\s\S]*?)</div>
由于沒有分支條件,因此大大減少了正則匹配過程的回溯深度。因此成功解決了這一問題。
目前能和大家分享的是,如果遇到類似問題還需簡化正則,減少分支條件等。
如果您有更好的方案歡迎您提出寶貴的建議。