2012-04-05 8 views
1

私はregex.Replaceを使用して文字列の一部を置き換える問題が発生しています。基本的な考え方は、文字列の先頭を取り込み、文字列の最後をコードの値で置き換えたいということです。私が「Test Number」と番号をつけた文字列があり、その番号を増やしたいとします。私は "テスト番号"をキャプチャしますが、新しい番号でキャプチャを連結しようとするとキャプチャ($ 1)をリテラルとして扱い、文字列全体を$ 1 [新しい番号]に置き換えます。regex.replaceの正規表現グループとの変数の連結

これは「We are $ 12」です。しかし、置換でリテラルを使用すると、問題は発生しません。

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

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

これは、「We are 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"で、キャプチャの置換は必要に応じて機能します。私はちょうどこれと同じ問題があった

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

残念ながら、私の実際のコードにはスペースがありませんが、私はあなたが何をしたか参照してください。私は連結が最初に正規表現の評価が起こったと思います。 ありがとうございます – dsrekab

+0

@dsrekab私はあなたに適した別のソリューションを追加しました。 – Jay

2

にスペースが存在しない場合にも使用することができ、より良い、より一般的な解決策は、MatchEvaluatorを受け入れRegex.Replaceオーバーロードを使用することです。これを修正するには、グループ番号を中括弧でエスケープします。ここで

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

は作業dotnetfiddleサンプルです:https://dotnetfiddle.net/1gZKNB

関連する問題