テキストボックス内にある文字列「ABCDE」の数をカウントする方法

タグの編集
投稿者 だいじゃ  (高校生) 投稿日時 2010/8/2 21:02:29
環境
・TextBox1
・Button1
・Label1

準備)TextBox1に文字列が色々入力されています。
①Button1を押したとき、
②TextBox1内の「ABCDE」という文字列の数を変数 Hensu に代入。
③その後 Hensu の内容をLabel1に代入し、表示させる。
というプログラムが組みたいです。

②のやり方がわかりません。
ご教授お願いします。

投稿者 魔界の仮面弁士  (社会人) 投稿日時 2010/8/2 21:58:30
(案1) Regex クラスを使って、マッチした回数を数える。

(案2) Replace を使って、"ABCDE" の 5文字を"6文字の何か" に置換し、
 置換前と置換後の文字列の長さを比較する。

(案3) Split を使って、"ABCDE" を区切り文字として配列に変換し、
 配列の要素数を調べる。


他にも InStr 等を用いるなどといった、いろいろな方法があるかと思います。
投稿者 るきお  (社会人) 投稿日時 2010/8/2 22:11:10
こんにちは。

私もときどきもっといい方法がないか気になるんですよね。

私がよく使う方法は魔界の仮面弁士さんの案2とほぼ同じです。便利なメソッドでもあればいいんですが。

    
Dim target As String = "ABCDE"
Dim temp As String = TextBox1.Text.Replace(target, "")

Dim count As Integer = (Len(TextBox1.Text) - Len(temp)) \ Len(target)

Label1.Text = count & "個あります。"


あと、細かいですが表現が気になったので
>③その後 Hensu の内容をLabel1に代入し、表示させる。
このような表現は普通はしないですね。
Hensuの内容をLabel1に表示させる。とか、
Hensuの内容をLabel1のTextプロパティに代入し、表示させる。なら
特に違和感はないです。
投稿者 るしぇ  (社会人) 投稿日時 2010/8/3 09:58:35
> 他にも InStr 等を用いるなどといった、いろいろな方法があるかと思います。 
プログラムの基礎練習として自分で作るならこの例が一番多いでしょう。

http://msdn.microsoft.com/ja-jp/library/cc344115.aspx
投稿者 よねKEN  (社会人) 投稿日時 2010/8/3 10:17:30
基本的には他の方の回答で解決するかと思いますので、
私のはただの細かいツッコミです。

> ②TextBox1内の「ABCDE」という文字列の数

今のご質問では「ABCDE」が探したい文字列とのことですが、以下のような場合はどうしたいですか?

例えば、TextBox1内のテキストがAAAで探したい文字列が「AA」だった場合。
「AA」の数は1つでしょうか?2つでしょうか?

今のところコメントされている方法はすべて「1つ」と数える方法です。
「2つ」と数えたい場合は、るしぇさんの提示のURLのコード(InStr関数を使って、
地道に検索する方法)に一部改造すれば、実現できますね。

InStr関数というVBの関数を用いる方法以外にも、
StringクラスのIndexOfメソッド、LastIndexOfメソッドなども調べてみてください。
投稿者 るしぇ  (社会人) 投稿日時 2010/8/3 11:30:48
>AAAで探したい文字列が「AA」だった場合。
>「2つ」と数えたい場合は
AAAAAで探したい文字列が「AAA」だった場合は3ですか。。。
パターン解析とかでありそうな処理ですねぇ。
新しい開始位置の設定の1行を変えるだけでできそうです。
投稿者 (削除されました)  () 投稿日時 2010/8/3 11:59:33
(削除されました)
投稿者 (削除されました)  () 投稿日時 2010/8/3 12:04:02
(削除されました)
投稿者 魔界の仮面弁士  (社会人) 投稿日時 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 の正規化に関わる問題もあったりします。
投稿者 だいじゃ  (高校生) 投稿日時 2010/8/3 20:19:24
皆様貴重なご意見ありがとうございました。
「るきお」さんの方法で無事成功しました。