2011-03-18 42 views
0

我试图在web应用中实现hashtag函数,以便轻松地将搜索链接嵌入到页面中。问题是我试图对散列标记进行替换,因此它们不会出现在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",并且不会按预期替换散列值。

有没有比正则表达式更好的工具工作?或者我可以做其他事情来正确地工作吗?

回答

1

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

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

+0

完美!!! MakeLink( “$ 2”)。这就是我想要的100%,'

'的预期/期望输出,这是my-tag散列tag

' – 2011-03-18 14:48:31

+0

我还更新了正则表达式,在单词之间包含一个短划线,所以'(#([a-z0-9 \ - ] +))''。可能你对逃跑部分有任何想法,这样如果他们有像'我的\#1粉丝'这样的东西,它不会把'#1'变成链接? – 2011-03-18 14:50:44

+1

我对此有点生疏,但我认为它被称为“消极lookbehind”,并且你正在寻找类似于(?<!\\\)的东西:((?<!\\\) )(注意:(a)我不确定这些括号是否是一个捕获组,在这种情况下,您需要使用$ 3而不是$ 2,并且(b)我不确定这是否适用于.NET。另外请注意,您将不得不用\#替换#。 – Rawling 2011-03-18 14:59:01

0

不替换你逃出井号标签,只是修改当前的正则表达式不匹配任何与越狱开始:

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

,然后申请一个新的正则表达式查找才躲过井号标签,并用转义的人代替他们:

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

如果输入的开始是一个hashtag,这会怎么办? – Rawling 2011-03-18 15:12:34

+0

ceykooo,工作代码:'Regex _regex = new Regex(@“((?<!\\)#([a-z0-9 \ - ] +))“);'那么这是一个简单的替换,用'#'替换'\#' – 2011-03-18 15:20:44

+0

我们可以检查一行'@”的开头( [^ \\] | ^)|(#([a-z0-9] +))“'并使用随后的匹配组,但在正常情况下我们仍然有一个匹配的空间,并且需要在后续代码,对于纯粹的正则表达式方法,回​​溯是一个更好的选择;在我的帖子之前,我没有看到您的评论。 – ceyko 2011-03-18 15:40:41