c#regex用于查找和替换匹配文本的重用部分

时间:2009-04-30 09:19:59

标签: c# regex

我需要搜索并替换长文本字符串。我想找到看起来像这样的断开链接的所有实例:

<a href="http://any.url.here/%7BlocalLink:1369%7D%7C%7CThank%20you%20for%20registering">broken link</a>

并修复它,使其看起来像这样:

<a href="/{localLink:1369}" title="Thank you for registering">link</a>

文本字段中可能存在多个这些断开的链接。我的困难在于如何重用匹配的ID(在本例中为1369)。在内容中,此ID从链接更改为链接,网址和链接文本也是如此。

谢谢,

大卫

编辑:为了澄清,我正在编写C#代码来运行数百个长文本字段来修复其中的断开链接。每个单独的文本字段都包含html,其中可以包含任意数量的断开链接 - 正则表达式需要全部找到它们并用正确版本的链接替换它们。

4 个答案:

答案 0 :(得分:2)

我假设您已经解析了元素和属性。因此,要处理URL,请使用以下内容:

    string url = "http://any.url.here/%7BlocalLink:1369%7D%7C%7CThank%20you%20for%20registering";
    Match match = Regex.Match(HttpUtility.UrlDecode(url), @"^http://[^/]+/\{(?<local>[^:]+):(?<id>\d+)\}\|\|(?<title>.*)$");
    if (match.Success) {
        Console.WriteLine(match.Groups["local"].Value);
        Console.WriteLine(match.Groups["id"].Value);
        Console.WriteLine(match.Groups["title"].Value);
    } else {
        Console.WriteLine("Not one of those URLs");
    }

答案 1 :(得分:2)

要在替换字符串中包含匹配项,请使用$&

可以在替换字符串see here for the list中使用许多其他替换标记。

答案 2 :(得分:2)

带上一粒盐,HTML和正则表达式不能很好地结合在一起:

(<a\s+[^>]*href=")[^"%]*%7B(localLink:\d+)%7D%7C%7C([^"]*)("[^>]*>[^<]*</a>)

应用于您的输入并替换为

$1/{$2}" title="$3$4

生成以下内容:

<a href="/{localLink:1369}" title="Thank%20you%20for%20registering">broken link</a>

这与单独的正则表达式一样接近。您需要使用MatchEvaluator delegate从替换中删除URL编码。

答案 3 :(得分:1)

感谢大家的帮助。这是我最后使用的内容:

const string pattern = @"(<a\s+[^>""]*href="")[^""]+(localLink:\d+)(?:%7[DC])*([^""]+)(""[^>]*>[^<]*</a>)";
// Create a match evaluator to replace the matched links with the correct markup
var myEvaluator = new MatchEvaluator(FixLink);

var strNewText = Regex.Replace(strText, pattern, myEvaluator, RegexOptions.IgnoreCase);

internal static string FixLink(Match m)
    {
        var strUrl = m.ToString();
        const string namedPattern = @"(<a\s+[^>""]*href="")[^""]+(localLink:\d+)(?:%7[DC])*([^""]+)(""[^>]*>[^<]*</a>)";
        var regex = new Regex(namedPattern);

        //const string strReplace = @"$1/{$2}"" title=""$4";
        const string strReplace = @"$1/{$2}"" title=""$4";

        HttpContext.Current.Response.Write(String.Format("Replacing '{0}' with '{1}'", strUrl, regex.Replace(strUrl, strReplace)));
        return regex.Replace(strUrl, strReplace);
    }