2012-04-05 28 views
1

我遇到了一個問題,我正在使用regex.Replace替換部分字符串。基本思路是我想捕獲字符串的開始,然後用代碼中的值替換字符串的結尾。舉個例子,假設我有一個字符串,表示「測試號碼」後跟數字,我想增加該數字。我捕獲了「測試編號」,但是當我嘗試將捕獲與新數字連接起來時,它將捕獲($ 1)視爲文字,並用$ 1 [新數字]替換整個字符串。在regex.replace中用regex組匹配連接變量

這將輸出「我們在$ 12」。但是,如果我在替換中使用文字,則問題不會發生。

Dim s as String = "We are on Test Number 1" 

s=Regex.Replace(s,"(Test Number)(\d)","$1" & "2") 

如預期的那樣,這將輸出「We are on Test Number 2」。

有沒有人有任何想法如何在包含捕獲的組時使用Regex.Replace的替換字符串部分中的變量?

在此先感謝。

回答

1
Dim s as String = "We are on Test Number 1" 
Dim newNumber as Integer = 2 

s=Regex.Replace(s,"(Test Number) (\d)","$1 " & newNumber) 

的問題是,當您連接,你最終指定「$ 12」,當然也沒有捕獲12在這種情況下,我們可以拿出從「測試號」後間隔,並將其添加在替換中,所以我們的替換字符串是「$ 1 2」,並且捕獲替換可以根據需要進行。

一個更好的,更通用的解決方案,這也可以在沒有空間存在使用時,要使用Regex.Replace重載接受MatchEvaluator

s = Regex.Replace(s, "(Test Number)(\d)", 
    New MatchEvaluator(Function(m as Match)(m.Groups(1).Value & newNumber))) 
+0

不幸的是,我的實際代碼沒有空間,但我看你做了什麼。我想這個連接首先發生在正則表達式評估中。 謝謝 – dsrekab 2012-04-05 17:05:30

+0

@dsrekab我已經添加了另一個應該爲你工作的解決方案。 – Jay 2012-04-05 18:42:49

2

我只是有這個同樣的問題。要解決它,請在大括號中跳出組號。

s=Regex.Replace(s,"(Test Number)(\d)","${1}" & newNumber) 

這裏的工作dotnetfiddle樣本:https://dotnetfiddle.net/1gZKNB