<p>testlkjsfdl</p>
<table xxx>
<tr>
<td align="centre" style="xxxxxx">
go home...
    <p>testper
    </p>
</td>
<td><p>best</p></td>
</tr>
</table>
<p align="center">
this
   </p>
谢谢。

解决方案 »

  1.   

    try...MatchCollection mc = Regex.Matches(yourStr, @"(?is)(?<!<td[^>]*>(?:(?!</?td\b).)*)<p[^>]*>(?:(?!</p>).)*</p>(?!(?:(?!</?td\b).)*</td>)");
    foreach (Match m in mc)
    {
        richTextBox2.Text += m.Value + "\n";
    }
      

  2.   


    (?:(?!</?td\b).)*  // 过客兄  这里的 . 是什么作用阿  还有 这里的表达式表示什么意思, 谢谢
      

  3.   

    i 不区分大小写
    s 单行模式
    等效于
    MatchCollection mc = Regex.Matches(yourStr, @"(?<!<td[^>]*>(?:(?!</?td\b).)*)<p[^>]*>(?:(?!</p>).)*</p>(?!(?:(?!</?td\b).)*</td>)",RegexOptions.IgnoreCase|RegexOptions.Singleline);
      

  4.   


    前面使用了(?s)的单行模式,所以这里的小数点“.”可以匹配任意字符(?:(?!</?td\b).)*
    这种写法的作用相当于使用排除型字符组,只不过排除型字符组只能排除字符序列,而不能排除一个子串
    对于楼主的需求,这种方式是符合要求的
    <td...>...</td>...<p...>
    而这几种方式是不符合要求的
    <td...>...<p...>
    <td...>...<td...>...</td>...<p...>
    那么抽象一下,不是以上情况的,就符合要求,这种写法的意义也就是要求<p...>前面不能是以上格式的子串举个简单的例子,取不在“<...>”内的数字,那么正则可以写作
    (?<!<[^<>]*)\d+(?![^<>]*>)
    楼主的需求,只不过是由一个字符变为一个子串,那么这里就不能用排除型字符组,而要用(?:(?!</?td\b).)*这种方式来排除一个子串了