例如:
<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本身就在链接内,那么也匹配到并替换的话,就不是很理想了。请正则高手指教,谢谢!
<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本身就在链接内,那么也匹配到并替换的话,就不是很理想了。请正则高手指教,谢谢!
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);如果有匹配不正确的,楼主给出实例,我再看下吧
第一步,把所有<>和<a></a>中的指定字符MYABC替换成“打死你**也不可能《》和我写的这串字符相同!”
第二步,正常替换MYABC到你想替换的字符
第三步,把“打死你**也不可能《》和我写的这串字符相同!”替换成MYABC
另外,我也想问过客,象这种(?<!<a(?![\s\S]*?</a>)[\s\S]*?)(?<!<[^<>]*)判断前置字符的方式,效率会不会有问题?
<img src="xxx.gif" alt="MYABC">MYABC<a href="http://www.csdn.net"><span>MYABC</span><br></a><b>MYABC</b>
第二个MYABC匹配不到,再考虑一下,写出来应该会比我写的简单,效率高
我改了改(?<!<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 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", "÷÷÷");
}
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);
}