2016-11-21 294 views
5

我有一句話,「姓名#2」,字符串正則表達式替換

我需要更換「#」,以「號」,

最後一句需要「名稱編號2" 。

碼 -

string sentence = Regex.Replace("Name # 2", "\\#\\b", "No."); 

顯然,Regex.Replace無法取代「#」與「否」,有沒有解決這個問題的正確道路,通過正則表達式。 感謝 我要尋找一個正則表達式的原因是因爲它執行的通用代碼,它看起來像下面

 string pattern = string.Format(@"\b{0}\b", context); 

    sentence = System.Text.RegularExpressions.Regex.Replace(sentence, pattern, suggestion); 

語境 - 「#」

一句話 - 「姓名#2」

建議 - 「否」

預期的一句話 - 「名稱2號」

實際一句話 - 「姓名#2」

語境 - 「是」

一句話 - 「他打算」

建議 - 「是」

預期的一句話 - 「他要」

實際句話 - 「他要」

語境 - 「一」

一句話 - 「他是在一個時間點去。」

建議 - 「Z」

預期的一句話 - 「他在一次ž點去」

+3

OMG!爲什麼是正則表達式? –

+0

@ThomasWeller我編輯了我的問題。 – Sandepku

+0

'\ b'匹配單詞邊界(字母數字和其他)。在你的輸入中'#'旁邊沒有這樣的邊界。 –

回答

6

如果#前面帶有一個當前的正則表達式不匹配word char,一個字母,數字或下劃線。發生這種情況是因爲字邊界的含義與上下文相關。

與任何下面的修復程序替換:

string pattern = string.Format(@"(?<!\w){0}(?!\w)", Regex.Escape(context)); 
           ^^^^^^ ^^^^^^ 

(?<!\w)(?!\w)是上下文無關的,並且如果不是前面/隨後與字字符將匹配的詞。

或者,使用

string pattern = string.Format(@"(?<!\S){0}(?!\S)", Regex.Escape(context)); 

只匹配內部空格(S)爲(?<!\S)負回顧後一個字需要的空格或字符串的「字」之前啓動,而負先行(?!\S)要求「單詞」後的字符串結尾或空白字符。

請注意,Regex.Escape是處理用戶輸入/動態模式構建時必須的,並且需要在正則表達式模式中使用字符串字符串。它會逃脫所有特殊字符(如?,+等),否則可能會破壞圖案。 OMG!

4
string test = "Name # 2"; 

test = test.Replace("#", "No."); 
+0

對不起,我需要通過正則表達式, – Sandepku

+0

test = Regex.Replace(test,「#」,「No.」); – mybirthname

+0

@Sandepku你應該解釋(編輯你的文章)爲什麼你*需要*使用正則表達式。 –

3

你可以試試:

string sentence = Regex.Replace("Name # 2", "#", "No."); 

#不必逃脫,因此不需要反斜槓。

+0

我可以嘗試很多。你爲什麼認爲它有效? –

2

使用正則表達式,你可以做到這一點,像這樣:

Regex.Replace("Name # 2", "#", "No.") 

或者只是一個普通的老與string.replace:

"Name # 2".Replace("#", "No.");