例如:
<img src="xxx.gif" alt="MYABC"><a href="http://www.csdn.net"><span>MYABC</span><br></a><b>MYABC</b>如果我想匹配“MYABC”,则我只想匹配到<b>中的那个,就是最后一个。
其他的两个:在< >之间的,或者包含在<a></a>之间的,我都不想匹配到。简单来说就是想实现一个把MYABC替换成链接的功能,但如果MYABC在<>HTML标识内或者MYABC本身就在链接内,那么也匹配到并替换的话,就不是很理想了。请正则高手指教,谢谢!

解决方案 »

  1.   

    话组织的够乱的....直接要拿myabc就是<b>(.*)?</b>
      

  2.   

    trystring yourStr = ............;
    string resultStr = Regex.Replace(yourStr, @"(?<!<a(?![\s\S]*?</a>)[\s\S]*?)(?<!<[^<>]*)MYABC(?![^<>]*>)(?!(?![\s\S]*?<a)[\s\S]*?</a>)", @"<a href=""http://www.csdn.net"">$0</a>", RegexOptions.IgnoreCase);如果有匹配不正确的,楼主给出实例,我再看下吧
      

  3.   

    ((?<!<a?[^>]*))([^<]+)(?![\s\S]*</a>)我的
      

  4.   

    过客,不愧是正则专家,这么复杂的正则都能写出来要是我来处理,就和把大象装到冰箱中一样,统共要分三步:
    第一步,把所有<>和<a></a>中的指定字符MYABC替换成“打死你**也不可能《》和我写的这串字符相同!”
    第二步,正常替换MYABC到你想替换的字符
    第三步,把“打死你**也不可能《》和我写的这串字符相同!”替换成MYABC
    另外,我也想问过客,象这种(?<!<a(?![\s\S]*?</a>)[\s\S]*?)(?<!<[^<>]*)判断前置字符的方式,效率会不会有问题?
      

  5.   

    我最近头脑不清醒-_-#,写的正则都很变态,应该可以简化,现在头晕,只能在功能上先达到要求再说了这样写性能上肯定会有损失,按这种要求来说,另一种实现方式就是用委托,但是委托一般要两次循环,性能要根据源字符串的大小,还有一些其它因素综合考虑,呵呵,写了一个,觉得那个也不会简单多少,就没有写firsk(杰少)的少考虑了一种情况
    <img src="xxx.gif" alt="MYABC">MYABC<a href="http://www.csdn.net"><span>MYABC</span><br></a><b>MYABC</b>
    第二个MYABC匹配不到,再考虑一下,写出来应该会比我写的简单,效率高
      

  6.   

    多谢过客指教
    我改了改(?<!<a\s[^>]*>|<[^>]*)MYABC(?!(<[^>]*>)*</a>) 在<img src="xxx.gif" alt="MYABC">MYABC<a href="http://www.csdn.net"><span>MYABC</span><br/></a><b>MYABC</b><a href>MYABC</a><span>MYABC</span><a><span>MYABC</span></a>下测试正常,感觉自己对正向预搜索反正预搜索还是比较菜,这个搞了我好一会
      

  7.   

    刚才又测了一下,无论是用我的,还是杰少的,都还存在问题的,这样做不是行不通,只是需要考虑的情况太多,写出来的正则并不能保证结果正确,采用了壮志的思路,暂时先这样吧string yourStr = ...........;
    string resultStr = Regex.Replace(yourStr, @"(<a[^>]*>[\s\S]*?MYABC[\s\S]*?</a>|<[^>]*MYABC[^>]*>)", new MatchEvaluator(regReplace), RegexOptions.IgnoreCase);
    resultStr = resultStr.Replace("MYABC", @"<a href=""http://www.oooo.net"">MYABC</a>");
    resultStr = resultStr.Replace("÷÷÷", "MYABC");private string regReplace(Match m)
    {
        return m.Value.Replace("MYABC", "÷÷÷");
    }
      

  8.   

    终于想到一个正规的方法,不至于转过去又转回来那样别扭string result = Regex.Replace(yourStr, @"((^|</a>)[\s\S]*?<a|</a>[\s\S]*$)", new MatchEvaluator(regReplace), RegexOptions.IgnoreCase);
    if (Regex.Matches(result, "</a>", RegexOptions.IgnoreCase).Count == 0)
        result = result.Replace("MYABC", @"<a href=""http://www.csdn.net"">MYABC</a>");
    private string regReplace(Match m)
    {
        return Regex.Replace(m.Value, @"(?<!<[^<>]*)MYABC(?![^<>]*>)", @"<a href=""http://www.csdn.net"">MYABC</a>", RegexOptions.IgnoreCase);
    }