正则表达式中的回溯

  正则表达式的引擎主要由2种:NFADFA。

  java的正则基于的是NFA,表达式主导,匹配成功即成功,正则nfa|nfa not匹配字符串nfa not的结果是nfa

  DFA是文本主导,会记录所有的匹配。

  

  使用正则表达式时需要注意回溯,否则可能会导致栈溢出。下面是一个例子程序:

String str2 = "<div class="ITinfo">" +
        "<ul class="ITinfo_ul">" + 
            "<li style=" font-size:14px;"><a href="../Board/Detail.asp?NewsID=001-0329"><B><font color="red">OA移动版本APP下载</font></B></a></li>" +
        "<li><a href=../Board/Detail.asp?NewsID=001-0584><font color=#000000>OA系统菜单权限模块调整通知</font></a></li><li><a href=../Board/Detail.asp?NewsID=011-0048><font color=#000000>IE10/11时间显示、附件上传解决..</font></a></li><li><a href=../Board/Detail.asp?NewsID=011-0051><font color=#000000>SSL&nbsp;VPN版本升级通知</font></a></li><li><a href=../Board/Detail.asp?NewsID=011-0050><font color=#000000>OA手机版切换完成</font></a></li><li><a href=../Board/Detail.asp?NewsID=001-0557><font color=#000000>关于使用域账号登录OA系统及密..</font></a></li><li><a href=../Board/Detail.asp?NewsID=001-0555><font color=#000000>K3/MES系统维护通知</font></a></li>"
        + "</ul>"
        + "<div class="ITinfo2">"
        +    "<form action="../tel/Tel_List.asp" type="post" name="query" id="query" onsubmit="return CheckForm(this)">"
        +        "<center><input name="content" id="content" type="text"><br />"
        +       "<input type="image" src="js/img/input2.jpg" style="margin-top:2px;margin-top:4px !important;" /></center>"
        +    "</form>"
        + "</div>"
        +"</div>";
        
        //<div[^>]*>(.*?|
*|
*)*</div> ==>Exception in thread "main" java.lang.StackOverflowError
        Pattern p2 = Pattern.compile("<div[^>]*>([\s\S]*?)</div>");
        Matcher m2 = p2.matcher(str2);

        while(m2.find()){
            for(int i=0;i<= m2.groupCount();i++){
                System.out.print("[" + m2.group(i) + "]");
            }
            System.out.println("");
        }
    }
原文地址:https://www.cnblogs.com/lnlvinso/p/4823203.html