正则表达式的引擎主要由2种:NFA和DFA。
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 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(""); } }