2014-04-03 127 views
1

我看了一些類似的話題,但無法找到即時通訊尋找如此即時通訊問一個新的問題。RegEx替換隻是部分匹配

是否有可能只替換匹配RegEx的字符串的一部分?

例如

我想更換00NN+NN。只是做一個簡單的替換00+不是一個選項。

RegEx下面定位了2到0之間的數字和2到1-9之間的數字。

Dim PhoneNumber AS String = Regex.Replace(IndexString, "([0][0][1-9]{2})", "+") 

這將替換整個00NN+,如果有可能有替換牢記以下NN所以它取代00NN+NN

回答

5

是的,有兩種方法可以做到這一點:

  1. 使用capturing group來存儲您要保留部分:

    Dim PhoneNumber AS String = Regex.Replace(IndexString, "\b00([1-9]{2})", "+$1")

    這裏,括號捕捉相關部分的正則表達式(它們是按順序編號的),並且可以使用$1作爲替換字符串中的第一組匹配項,$2作爲第二組的替代項等。 (整個比賽爲$0)。

  2. 使用positive lookahead assertion

    Dim PhoneNumber AS String = Regex.Replace(IndexString, "\b00(?=[1-9]{2})", "+")

    這裏,(?=...)只聲稱這是可能在當前位置匹配...實際上不使其成爲比賽的一部分。該解決方案可能比第一種解決方案更快。

一兩件事:你應該使用word boundary anchor\b),以確保你不小心在號碼中間匹配00 - 你可能不希望00493010023456成爲+49301+23456,你?

+0

謝謝!捕獲組是非常有趣的,這將幫助我解決其他問題;) –

+0

蒂姆,我申請了這個,我希望我能夠upvote你回答! –

+0

@KayNelson - 儘管第一個人可能會讓人失望,而且我們知道Tim已經有了很好的聲譽,如果你認爲Tim的回答真的是最好的,你應該取消選擇第一個選擇的答案並選擇Tim's(只是讓如果它仍然是一個很好的答案,那麼你肯定會讚揚第一個人的答案) - 這樣,稍後有人來這裏可以先看到最好的答案。 –

2

您可以使用向前看符號只你想要的匹配:

Regex.Replace(IndexString, "00(?=[1-9]{2}))", "+") 

(?=...)是一個零寬度斷言,只有在內部匹配的情況下才會匹配,所以它會執行所需的檢查而不選擇在NN

+0

非常好!工作完美! –