有一段文字,比如:<p>11</p>aaa<p>22</p>bb<p>33</p>
我想写一个正则表达式来匹配,分别输出如下结果:
<p>11</p>
<p>22</p>
<p>33</p>
我的写法如下:
        MatchCollection mc;        string result = "<p>11</p>aaa<p>22</p>bb<p>33</p>";
        Regex r = new Regex("<p>.*</p>");
        mc = r.Matches(result);        for (int i = 0; i < mc.Count; i++)
        {
             
            Response.write(mc[i].Value+"<br>");
       
        }
上面的运行结果直接显示::<p>11</p>aaa<p>22</p>bb<p>33</p>,不知这个正则表达式要怎么写,谢谢.

解决方案 »

  1.   

    try...string test = "<p>11 </p>aaa <p>22 </p>bb <p>33 </p> ";
    Regex reg = new Regex(@"(?is)<p[^>]*>(?:(?!</?p\b).)*</p>");
    MatchCollection mc = reg.Matches(test);
    foreach (Match m in mc)
    {
        richTextBox2.Text += m.Value + "\n";
    }
      

  2.   

    楼主使用了贪婪模式,最简单的改法Regex r = new Regex("<p>.*?</p>"); 这种是非贪婪模式,一般来说,在匹配成功的情况下,非贪婪模式效率较低简单来说
    贪婪模式就是在匹配成功的前提下,尽可能多的匹配
    非贪婪模式就是在匹配成功的前提下,尽可能少的匹配
      

  3.   

    试试这样
    Regex r = new Regex(" <p>[0-9]* </p>");
      

  4.   


    谢谢,这个方法可以实现,请问lxcnn,除了这个非贪婪模式外,还有没有其他效率更高的方法?再次感谢.
      

  5.   

    我1楼给的就属于贪婪模式的实现
    2楼给出的才是非贪婪模式的实现这两种方式,在匹配失败的情况下效率基本上是没什么区别的
    但是在匹配成功的情况下,还是1楼的实现方式效率要高当然,如果你能确定<p...>和</p>之间的字符串很少,就如你的例子一样,那这两种写法用哪种其实无所谓了,基本上感觉不到效率差异的关于原理,楼主可以看下《精通正则表达式(第三版)》,后面我也可以整理一下
      

  6.   

    感谢lxcnn,受益非浅.本人对正则表达式不熟,希望以后有机会还可以请教.现在结帖