2014-07-02 66 views
3

我有這個字符串:正則表達式替換整個單詞

元60:80節點1 2 3榆樹55元60 MPC 1:999 ELEM 123

我要全部替換 「榆樹」我的字符串中的「E」和「Elem」改爲「Element」。我不想將「節點」替換爲「NodElement」,所以我需要使用單詞邊界來匹配整個單詞。

對於我正在使用此正則表達式:

Regex regexElements = new Regex("\b(E|Elm|Elem)\b", RegexOptions.IgnoreCase); 

foreach(Match m in regexElements.Matches(str)) 
{ 
    MessageBox.Show("Match: " + m.Value"); 
} 

str = regexElements.Replace(str, "Element"); //str is my string 

但我看不出有任何更換也正在顯示一個消息框。 有趣的是,我仍然可以使用Notepad ++搜索來定位所需的單詞。 這裏發生了什麼? 感謝

+0

您正在使用'n.Value'而不是'm.Value'。此外,你可以簡化你的正則表達式到'@「\ bE(le?m)?\ b」' – Jerry

+0

我已經修復了發佈的代碼,謝謝。 – Sturm

+0

你可以看看Lookahead正則表達式,下面的鏈接可能有助於http://www.zorched.net/2009/05/08/password-strength-validation-with-regular-expressions/ – Damian

回答

4

您需要原始的正則表達式。單獨的\b並不意味着一個字的界限(我不完全確定它的意思,但它不是一個字面的b,所以它可能像退格一樣)。因此,無論您使用\\b或者你在我的評論使用@像,從而使最終的代碼變成:

Regex regexElements = new Regex(@"\b(E|Elm|Elem)\b", RegexOptions.IgnoreCase); 

foreach(Match m in regexElements.Matches(str)) 
{ 
    MessageBox.Show("Match: " + m.Value); 
} 

str = regexElements.Replace(str, "Element"); //str is my string 

或者

Regex regexElements = new Regex("\\b(E|Elm|Elem)\\b", RegexOptions.IgnoreCase); 

foreach(Match m in regexElements.Matches(str)) 
{ 
    MessageBox.Show("Match: " + m.Value); 
} 

str = regexElements.Replace(str, "Element"); //str is my string 

我也建議此正則表達式這是稍微更優化:

​​
+1

謝謝!獲得的經驗 – Sturm

+0

@Sturm不客氣! – Jerry

+1

+1不能相信我錯過了。 – James

0

有沒有必要使用正則表達式爲:

String yourString = "Element 60:80 Node 1 2 3 Elm 55 Element 60 mpc 1:999 Elem 123" ; 

yourString = yourString.Replace("Elem", "Element").Replace("E ", "Element ").Replace("Elm", "Element"); 
+0

因爲我是新的正則表達式,我想知道爲什麼解決這個問題的最初方法不起作用。但是,謝謝你的建議。 – Sturm

+1

是的,這將取代任何'E' /'Elem'和'Elm'的發生,然而,OP表示他們不想替換像'NodeElem'等場景。 – James