1

文字列の一部を置き換えるためにregex.Replaceを使用しているときに問題が発生します。基本的な考え方は、文字列の先頭をキャプチャしてから、文字列の末尾をコードの値に置き換えることです。たとえば、「テスト番号」の後に番号が続く文字列があり、その番号をインクリメントしたいとします。「テスト番号」をキャプチャしますが、そのキャプチャを新しい番号と連結しようとすると、キャプチャ($ 1)がリテラルとして扱われ、文字列全体が$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です」と出力されます。ただし、置換でリテラルを使用すると、問題は発生しません。

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

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

これにより、期待どおりに「テスト番号2にいます」と出力されます。

キャプチャされたグループを含めるときに、Regex.Replaceの置換文字列部分で変数を使用する方法について誰かが考えていますか?

前もって感謝します。

4

2 に答える 2

3

私はちょうどこれと同じ問題を抱えていました。これを修正するには、中括弧でグループ番号をエスケープします。

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

動作するdotnetfiddleサンプルは次のとおりです:https ://dotnetfiddle.net/1gZKNB

于 2015-02-27T20:04:34.227 に答える
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がないことです。この場合、「テスト番号」から末尾のスペースを取り出して置換に追加できるため、置換文字列は「$12」で、キャプチャの置換は必要に応じて機能します。

スペースが存在しない場合にも使用できる、より優れた、より一般的なソリューションは、 :Regex.Replaceを受け入れるオーバーロードを使用することです。MatchEvaluator

s = Regex.Replace(s, "(Test Number )(\d)",
   New MatchEvaluator(Function(m as Match)(m.Groups(1).Value & newNumber)))
于 2012-04-05T16:53:29.753 に答える