替换和RegEx问题

时间:2014-12-06 13:14:25

标签: c# regex replace

我正在使用LinqToTwitter API处理twitter API。在那里,我试图格式化推文文本。但是我有替换和下面的正则表达式的问题是我从twitter获得的字符串

@TheNational: ICYMI: Louvre be first museum in Asia to show a painting http://t.co/fmp http://t.c…

现在我使用下面的代码将所有URL替换为Link以进行显示。

首先我创建正则表达式来获取链接

private readonly Regex _parseUrls = new Regex("(?<Protocol>\\w+):\\/\\/(?<Domain>[\\w@][\\w.:@]+)\\/?[\\w\\.?=%&=\\-@/$,]*", RegexOptions.IgnoreCase | RegexOptions.Compiled);

然后我匹配它们并替换如下

foreach (var urlMatch in _parseUrls.Matches(tweetText))
  {
    Match match = (Match)urlMatch;
    tweetText = tweetText.Replace(match.Value, string.Format("<a href=\"{0}\" target=\"_blank\">{0}</a>", match.Value));
  }

正则表达式按预期工作得非常好,但现在替换是一个问题,因为字符串中的两个链接都以http://t.co开头,每次都会替换它。

有人帮助我,我失踪了。

1 个答案:

答案 0 :(得分:1)

这不是替换的正确方法。

使用Regex.Replace方法:

_parseUrls.Replace(tweetText, "<a href=\"$&\" target=\"_blank\">$&</a>");

或者,更好的是,使用HTML编码:

_parseUrls.Replace(tweetText,
                   match => string.Format("<a href=\"{0}\" target=\"_blank\">{1}</a>",
                                          match.Value,
                                          WebUtility.HtmlEncode(match.Value))
                  );

例如,这会将网址中的&转为&amp;标记内的<a>。你甚至应该对字符串的剩余部分进行编码:如果某人发布了一些HTML代码,你就要按原样显示它而不是解释它。

原始方法的问题是_parseUrls.Matches(tweetText)会在每次迭代时再次匹配替换的文本。