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

正则高手请进。。。
如果我想过滤网页内容里以下两种格式里的关键字,比如关键字"csdn"如果被包含在以下两种格式里,则不替换为链接,否则就替换成指定的链接,正则如何写呢:
1、过滤"http://www.csdn.net"里的csdn;
2、过滤"aaacsdnbbb"里的内容"aaacsdnbbb"里的csdn;
如果塞北的雪在线,请作答:)

------解决方案--------------------
其实还有一个办法就是把带有http://的和带有<a>...</a>的,里面的CSDN都替换成一个实现假定的字符串,这个字符串不再文本内出现过

然后,string.Replace()替换掉CSDN

最后在把先前的csdn替换回去
------解决方案--------------------
C# code

         string inputString = "噢噢噢[url='http://www.cSdN.net']cSdn[/url]哈哈哈[url=http://www1.cSdn.com]aaaCSDnbbb[/url]我是csDn你是csDN吗?";
            string strR="Northsnow";
            string strR2="$1" + strR + "$2";
            string strResult;
            strResult = Regex.Replace(inputString, @"([url\s*=\s*[\'\""\s]*?[^\""\']*[\'\""]*?\][^\[\]]*?)csdn([^\[\]]*?\[/url])",strR2,RegexOptions.IgnoreCase );

            strResult = Regex.Replace(strResult, @"([url\s*=\s*[\'\""\s]*?[^\""\']*?)csdn([^\""\']*?[\'\""]*?\][^\[\]]*?\[/url])", strR2, RegexOptions.IgnoreCase);

            strResult = Regex.Replace(strResult, @"(csdn)", "[url='http://blog.csdn.net/precipitant']$1[/url]", RegexOptions.IgnoreCase);

            strResult = strResult.Replace(strR, "csdn");
            MessageBox.Show(inputString + System.Environment.NewLine + strResult );

------解决方案--------------------
-_-#表述问题不清楚,这类问题最适合用委托来处理了

借用楼上的例子


C# code
string test = "噢噢噢[url='http://www.cSdN.net']cSdn[/url]哈哈哈[url=http://www1.cSdn.com]aaaCSDnbbb[/url]我是csDn你是csDN吗?";
string result = Regex.Replace(test, @"^[\s\S]*?(?=\[url[^\]]*\])|\[/url\][\s\S]*?(?=\[url[^\]]*\])|\[/url\][\s\S]*?$|^[\s\S]*$", myEvaluator, RegexOptions.IgnoreCase);
MessageBox.Show(result);


private string myEvaluator(Match m)
{
    return Regex.Replace(m.Value, @"csdn", "[url='http://www.csdn.net']csdn[/url]", RegexOptions.IgnoreCase);
}