2011-03-18 40 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