日期:2014-05-18  浏览次数:20448 次

正则:匹配HTML标识外的非链接内的指定字符
例如:
<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本身就在链接内,那么也匹配到并替换的话,就不是很理想了。

请正则高手指教,谢谢!

------解决方案--------------------
过客,不愧是正则专家,这么复杂的正则都能写出来

要是我来处理,就和把大象装到冰箱中一样,统共要分三步:
第一步,把所有 <> 和 <a> </a> 中的指定字符MYABC替换成“打死你**也不可能《》和我写的这串字符相同!”
第二步,正常替换MYABC到你想替换的字符
第三步,把“打死你**也不可能《》和我写的这串字符相同!”替换成MYABC


另外,我也想问过客,象这种(? <! <a(?![\s\S]*? </a> )[\s\S]*?)(? <! <[^ <> ]*)判断前置字符的方式,效率会不会有问题?
------解决方案--------------------
多谢过客指教


我改了改

(? <! <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>

下测试正常,感觉自己对正向预搜索反正预搜索还是比较菜,

这个搞了我好一会。。。
------解决方案--------------------
刚才又测了一下,无论是用我的,还是杰少的,都还存在问题的,这样做不是行不通,只是需要考虑的情况太多,写出来的正则并不能保证结果正确,采用了壮志的思路,暂时先这样吧

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 ", "÷÷÷ ");
}