投稿者 魔界の仮面弁士  (社会人) 投稿日時 2010/8/3 12:05:33
検索する文字列によっては、IndexOf 法、InStr 法、Replace 法で
結果が異なってくる事に注意が必要です。

Dim source As String = "[バンド]という文字列"
Dim target1 As String = "バンド"
Dim target2 As String = "バンド"    '「゙」は ChrW(&H3099)  結合文字用濁点 
Dim target3 As String = "ハ゛ント゛"    '「゛」は ChrW(&H309B)  仮名濁点 

上記 source 内に、target1~3 が含まれているかどうかを調べる場合:

'String.IndexOf を使った例(一致する部分が無いと -1 を返す) 
Console.WriteLine(source.IndexOf(target1))  '1 
Console.WriteLine(source.IndexOf(target2))  '1 
Console.WriteLine(source.IndexOf(target3))  '1 
Console.WriteLine()

'String.Replace を使った例(一致した部分が置き換わる) 
Console.WriteLine(source.Replace(target1, ""))  '[]という文字列 
Console.WriteLine(source.Replace(target2, ""))  '[バンド]という文字列 
Console.WriteLine(source.Replace(target3, ""))  '[バンド]という文字列 
Console.WriteLine()


見ての通り、結果が異なってしまいますよね。


また、VB 側で用意された関数を使う場合においても、Option Compare Text モードにおいて、
正しく処理されないパターンがあります。(VB6 ではこの現象は発生しません)

'InStr をテキスト比較で使った例(一致する部分が無いと 0 を返す) 
Console.WriteLine(InStr(1, source, target1, CompareMethod.Text))  '2 
Console.WriteLine(InStr(1, source, target2, CompareMethod.Text))  '2 
Console.WriteLine(InStr(1, source, target3, CompareMethod.Text))  '2 
Console.WriteLine()

'Replace をテキスト比較で使った例(一致した部分が置き換わる) 
Console.WriteLine(Replace(source, target1, "", , , CompareMethod.Text))  '[]という文字列 
Console.WriteLine(Replace(source, target2, "", , , CompareMethod.Text))  '[いう文字列 
Console.WriteLine(Replace(source, target3, "", , , CompareMethod.Text))  '[いう文字列 
Console.WriteLine()


# このほか、Unicode の正規化に関わる問題もあったりします。