|
■No44672 (やまり さん) に返信
> MSDNも眺めたのですが、Count:= でなんばんめ、というのが取れるのを読み取れませんでした・・・
「Replace(Src, "これ", "あれ", Count:=1)」の代わりに、
「Replace(Src, "これ", "あれ", , 1)」や
「Replace(Src, "これ", "あれ", 1, 1)」と書く事もできます。
それと先ほど
>> 汎用的にするなら、gtk2k さんの方法かな。
と書きましたが、下記のようにする必要がありそうです。
Dim ms As MatchCollection = Regex.Matches(strSrc, Regex.Escape(strMatch))
Dim strDst As String
If ms.Count = 0 Then
strDst = strSrc
Else
Dim idx As Integer = rnd.Next(ms.Count)
strDst = strSrc.Substring(0, ms(idx).Index) & strReplace & strSrc.Substring(ms(idx).Index + strMatch.Length)
End If
Regex.Escape は、文字列に『(』などが含まれていた場合への備え、
If 判定は、一回もヒットしなかった場合に対応したものです。
>> Start:=x で、検索開始位置を調整することもできます。
> そんなこともできるんですね。これも使えそうですね。
Start 引数は、(検索回数ではなく)文字位置を表す引数なので、今回の用途では
ここに指定すべき数値を調べるためのコードが、別途必要になりますけれどね。
>> Function(sz) If(Interlocked.Add(n, 1) = 3
> これがちょっとどういう意味かわからないので、
VB のラムダ式では代入文を記述できないので、「n += 1」に相当するコードを、
Interlocked.Add メソッドで代用しています。
ラムダ式だと分かりにくいようであれば、先の Regex.Replace の部分を、
matchedCount = 0
ret = Regex.Replace("これとこれとこれとこれ", "これ", AddressOf Matched)
という記述に読み替えてみてください。
これは、
文字列中に "これ" が見つかるたびに、Matched メソッドが呼び出され、
その箇所が Matched メソッドの戻り値によって置換される
という処理を表しています。
ここでいう matchedCount や Matched は、たとえば下記のように実装されます。
Module Foo
Public matchedCount As Integer = 0
Public Function Matched(ByVal m As Match) As String
matchedCount += 1
If matchedCount = 3 Then
Return "あれ"
Else
Return "これ"
End If
End Function
End Module
そして上記をラムダ式を使って短く記述したものが、先の
n = 0
ret = Regex.Replace("これとこれとこれとこれ", "これ", Function(x) If(Interlocked.Add(n, 1) = 3, "あれ", "これ"))
というわけです。
|