大家好! 我遇到了一个正则表达式问题  
Regex rx = new Regex(@"(<\/?(?!td|tr|u|table|img|div|span|br|object|select|/select|OPTION|/OPTION|param|&nbsp|sup|/sup|sub|/sub|p|/p)[^>\/]*)\/?>|<![^>]+>", RegexOptions.IgnoreCase);
string result = rx.Replace(str, "");
我的目的是 滤掉 html标记(除tr|u|table|img|div|span.....特殊标记)遇到问题是str="<font>111<IMG ondblclick=Modify(this); title=\"wertewt< < < 123.GIF\"></font>"; 应得到结果:111<IMG ondblclick=Modify(this); title="wertewt< < < 123.GIF" >
但实际 我得到的是 111<IMG ondblclick=Modify(this); title="wertewt

解决方案 »

  1.   

    有事出去了,刚刚在站内信里给你回过了,不过那种委托的方法对于这一问题,解决得并不完美,而如果用平衡组,效率又太低,主要是看你的源字符串和复杂程度了,<...>内“<”和“>”这两个字符是否都有可能出现,如果只会出现“<”,用我写的委托方法即可,否则说明一下,晚上回去看看,如果能抽出时间,用其它方法给你写一下吧
      

  2.   

    字符串的子串  
      < < < 123.GIF">
    与你的模式匹配,被替换掉了,
      

  3.   

    你想滤掉 html 标记,建议你不要用一个模式处理所有标记,可以写一组模式,每个模式滤掉一个标记,用循环来处理。这样做有两个好处,首先,每个标记的模式都很简单,日后很好理解,其次,你可以在外部文件中记录这组模式,当你想增加两个标记时不需要重新编译。比如去掉 font,用这个模式把原来的串换成 $1,(?is:<font>(.*?)</font>)
      

  4.   

    LS是否考虑过下面这个问题
    <IMG ondblclick=Modify(this); title=\"wertewt< < < 123.GIF\">
    如果考虑并解决了,那么一个正则就全部解决了,根本用不着多个正则,如果上面这个问题没有解决,那么再多的正则也没用另外就是正则效率本来就低,如果再写多个正则,每个正则去循环替换一次,那效率就不用想了因为可能在""或''内锯含“<”和“>”这两个字符,所以无法使用平衡组来做,只能用多重匹配,但写了一个,在测试工具里通过,程序里会导致程序崩溃,正则解决这类问题还是比较吃力的在另一个帖子里我用有限状态机实现了,可以做下参考
    http://community.csdn.net/Expert/topic/5744/5744945.xml?temp=.806698
      

  5.   

    html的规则其实很复杂的。<(\w+)>[^<]+<\1>这样的,或者没有后面部分的。或者嵌套的。规则复杂的还是交给.net作好了。你html放到webbrower里头,然后用outterText获取文本。
      

  6.   

    过客,你的代码我看了,太复杂没有看懂。关于效率,网页一般都不大,比如http://ent.tom.com/2007-09-01/000E/08835712.html只有两万个字,用 ^.+?<!---content--->(.+?)<!---content--->.+?$ 去掉不需要的,只有不到3000个。每个网页我用大概30个模式处理内容,速度上可以接受。上面的话是从实用角度出发。对于正则和字符串处理的算法,我确实很佩服你。
      

  7.   

    其实以前我也不怎么关心效率问题,不过有一次给别人解决问题,写了一个正则,处理一页内容用了大概3秒多,楼主说处理页面较多,那样的效率是不能容忍的,后来改了一下,仅仅是去掉了几个“?”,处理一页仅用不到0.01秒,从那时起开始注意效率问题了扯得有点远,就楼主这一问题而言,关键不在于多少个正则,而是正则能不能做到的问题,即如何处理<...>标签内出现的“<”和“>”这两个字符的问题,理论上是可以的,事实上我也写了一个这样的正则,正则测试工具里也是可以通过的,但是放在程序里,就导致程序崩溃了另一方面,如果上面这一问题解决了,一个正则表达式足够了,扩展性也不会比分开写差的只不过正则在处理这类问题上还是比较吃力的,考虑到效率问题,我换了有限状态机这种方式来解决,那个其实主要是几个状态之间的转换,如果能当面来讲,几分钟也就能说明白了^o^只不过相对于写代码的过程,思考的过程要麻烦一些呵,正则我也只能做到熟练应用而已,大家互相学习,共同进步吧~