上一个帖子学明白了,又遇到这个问题,有时后TABLE是嵌套的,所以“(?is)<table。*?</table>”就不灵了~~
我自己瞎写了一个“(?i)<table?=(<table.*?</table>)?</table>”,跟本就不好使,我也不知道我错在哪里了,还请大侠们指点一下~~谢谢了~~

解决方案 »

  1.   

    比如:
    <table>
    <tr>
    <td> <table>
     <tr>
     <td></td>
     </tr>
     </table></td>
    </tr>
    </table>
      

  2.   

    import java.util.regex.*;public class Test{
        public static void main(String args[])  {
         String str="<table>\n"
                   +"<tr> \n"
                   +"<td> \n"
                   +"<table> \n"
                   +"<tr> \n"
                   +"<td> </td> \n"
                   +"</tr>\n"
                   +"</table> \n"
                   +"</td> \n"
                   +"</tr> \n"
                   +"</table>\n";
         String regex="(?is)(?:<table>.*?)+?(?:</table>.*?)+"; //这个正则不能判断嵌套是否正确.
         System.out.println(str.matches(regex));
                   
        }
    }
      

  3.   

    "(?is)(?:<table>.*?)+?(?:</table>.*?)+"
    (?is)是设置匹配时的模式是DOTALL且忽略大小写。
    (?:)表示是非捕获组,用了能提高一些效率,不用也可以,详见火龙果的说明。
    如果不用就成了:
    "(?is)(<table>.*?)+?(</table>.*?)+"
    (<table>.*?)+?用来匹配<table>后根一串任意字符组成的组,这样的组有1到多个。
    其中的?叫Reluctant的量词,表示是一点点的匹配,一般用来取最小的匹配结果。
    详见火龙果的帖子:
    http://topic.csdn.net/u/20080325/17/fb7a3e8d-029a-4d8e-89ae-77a9d28ec301.html
    中的34楼的回答。(</table>.*?)+不用解释了吧。
      

  4.   

    回bigbug9002,这个表达式看得懂,但不明白为什么这样写会匹配嵌套的<table>,能否再讲解写一下,还有为什么你说不能确定嵌套是否正确?谢谢了~~
      

  5.   

    (?:<table>.*?)这个把第一个<table>给非捕获了。
      

  6.   

    m.find()如果为真直接取substring就行了吧
      

  7.   


    匹配嵌套的<table>不是非常明显吗?若干个<table>与最近的若干个</table>.这个正则就是匹配这样的东西的。之所以说不能确定嵌套是否正确就是因为是“若干个”,而不能确定具体的数目是多少。