JAVA 正则表达式的溢出问题 及不完全解决方案。 (感谢Lancelot 在评论中给出的方法)

JAVA 正则表达式的溢出问题 及不完全解决方案。 (感谢Lancelot 在评论中给出的方法)

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+,具体数字忘记了,就会出现堆栈溢出。
 我在实际应用的场景是,匹配一个网页寻求《div》《/div》 之间的内容。当div 之间字符达到了950的时候这时候产生了 类似以上的错误。
经过分析,和网友遇到的类似问题贴http://topic.csdn.net/u/20110303/10/6a7dce52-481b-430a-b442-98099e9a01c9.html
得出以下不完全正确的解析方案

在正则表达式匹配时对字符个数进行限制 如:"<div>(.*?|\n*|\r*)*</div> 变成了 <div>(.*?|\n*|\r*){0,700}</div> 这样达到了限制字符的作用。
但是当解析到此条目时速度仍然非常慢。

如果您有更好的解决方案请您联系我。

欢迎转帖。转帖请标注出处,以更好的和大家探讨解决问题。

——————————————————————————————————————
Lancelot 提出的正则<div[^>]*>([\s\S]*?)</div>  或<div>([\s\S]*?)</div>
由于没有分支条件,因此大大减少了正则匹配过程的回溯深度。因此成功解决了这一问题。
目前能和大家分享的是,如果遇到类似问题还需简化正则,减少分支条件等。
如果您有更好的方案欢迎您提出宝贵的建议。

你可能感兴趣的:(JAVA 正则表达式的溢出问题 及不完全解决方案。 (感谢Lancelot 在评论中给出的方法))