正则表达式替换字符串函数不能按预期工作

时间:2011-03-18 14:10:33

标签: c# regex

我正在尝试在网络应用中实现主题标签功能,以便轻松地将搜索链接嵌入到网页中。问题是我正在尝试对哈希标记进行替换,因此它们不会出现在HTML输出中。由于我也想在输出中也能有哈希标记,所以我不能在处理结束时对整个字符串做最后的Replace。我希望能够像\#1 is my answer那样转义一些哈希标记,我会找到并用\#替换#,但那是另一个问题,我是甚至没有做好准备(但仍在考虑中)。

这是我到目前为止在控制台应用程序中模拟的内容,

static void Main(string[] args)
{
    Regex _regex = new Regex(@"(#([a-z0-9]+))");
    string link = _regex.Replace("<p>this is #my hash #tag.</p>", MakeLink("$1"));
}
public static string MakeLink(string tag)
{
    return string.Format("<a href=\"/Search?t={0}\">{1}</a>", tag.Replace("#", ""), tag);
}

输出结果为:
<p>this is <a href="/Search?t=#my">#my</a> hash <a href="/Search?t=#tag">#tag</a>.</p>

但是当我在运行MakeLink()时运行它时,它的字符串显示在调试器输出中的"$1"处,而不是按预期替换哈希值。

是否有比正则表达式更好的工具?或者,我可以做其他事情来使其正常工作吗?

2 个答案:

答案 0 :(得分:1)

请注意,您将文字“$ 1”传递给MakeLink,而不是第一个捕获的组。因此你的.Replace(“#”,“”)什么都不做。然后,正则表达式将MakeLink输出中出现的两次“$ 1”替换为第一个捕获组。

如果你用“$ 2”取代“$ 1”,那么我认为你得到了你想要的结果,而不是你期望的那样。

答案 1 :(得分:0)

要不替换转义的主题标签,只需修改当前的正则表达式,使其与以转义开头的任何内容都不匹配:

Regex _regex = new Regex(@"[^\\](#([a-z0-9]+))");

然后应用一个新的正则表达式来查找转义的主题标签并用未转义的标签替换它们:

Regex _escape = new Regex(@"\\(#([a-z0-9]+))");
_escape.Replace(input, "$1");