C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: リッチテキストボックスの中身を検索する


(過去ログ 58 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■32639 / inTopicNo.1)  リッチテキストボックスの中身を検索する
  
□投稿者/ OROCHI (5回)-(2009/02/11(Wed) 16:08:04)

分類:[C#] 

OS:windowsXP
開発:Visual C# 2008

こんにちは、現在2つのリッチテキストボックスを用意して、上段のリッチテキストボックスに書いた内容を検索して、下のリッチテキストボックスに表示させるプログラムを作ろうとしています

動作例

上段の内容

A1 C1
B1 D1
A1_1 A12

ここで、検索条件を[A]とした場合、下段に以下の内容を表示(Aの後の文字列は英字・数字・アンダーバーだけとし、これらの文字以外が出現するまでを表示する)

1
1_1
12

このようなプログラムを作りたい場合、大体以下のような流れで書けばいいと思うのですが、一部不明な点があります
わかる方、教えていただけないでしょうか

1.上段のリッチテキストボックスの内容を取得
this.richTextBox1.SelectAll(); // 全ての値を選択
// 選択した値を取得
string getstringvalue = richTextBox1.SelectedText;


2.取得した内容に対して指定した文字列があるかどうか判定する
      // 指定した文字列があるかどうか判定する
if (getstringvalue.Contains("A") == true)
{
// 含まれていた場合、Aは何文字目?
int ifind = getstringvalue.IndexOf("A");
Console.WriteLine(ifind.ToString());
// Aの後が半角英数字か_でなくなったときまで読み取る
int subcount3 = 0;
while (true)
{
char a = getstringvalue[ifind + 2 + subcount3];
// 文字がアンダーバーであった場合、breakしない
if (a == 0x5f)
{
subcount3++;
}
// 文字が数字か英字であるか否か判定する
else if (char.IsLetterOrDigit(getstringvalue[ifind + 2 + subcount3]) == false)
{
break;
}
else
{
subcount3++;
}
}
getstringvalue.Substring(ifind + 2, subcount3); // Aの後に続く文字列だけ取り出す
}
3.結果を下段のリッチテキストボックスに表示


ここで問題は2と3です
2の問題はこの方法だと、最初のひとつしか拾うことができないという問題があるので、全てを拾えるような組み方が判らないので教えていただけないでしょうか?

3の問題は、下のリッチテキストボックスに1行ずつ表示させたいのですが、1行ずつ書く方法がわからないので教えていただけないでしょうか?


引用返信 編集キー/
■32640 / inTopicNo.2)  Re[1]: リッチテキストボックスの中身を検索する
□投稿者/ やじゅ (929回)-(2009/02/11(Wed) 19:30:33)
やじゅ さんの Web サイト
2009/02/11(Wed) 20:02:27 編集(投稿者)
>■No32639 (OROCHI さん) に返信
> A1 C1
> B1 D1
> A1_1 A12
> 
> ここで、検索条件を[A]とした場合、下段に以下の内容を表示
> Aの後の文字列は英字・数字・アンダーバーだけとし、これらの文字以外が出現するまでを表示する)
> 
> 1
> 1_1
> 12
> 

正規表現を使いました。
英字・数字・アンダーバー以外の文字を区切り文字として、先頭がAの文字列を抽出

using System.Text.RegularExpressions;
private void button1_Click(object sender, EventArgs e)
{
    Match m = Regex.Match("A1 C1 B1 D1 A1_1 A12", "(?<moji>A[\\w_]*)");

    while(m.Success){
        this.richTextBox1.Text += m.Groups["moji"].ToString().Substring(1) + "\n";
        m = m.NextMatch();
    }
}

結果
1
1_1
12

引用返信 編集キー/
■32838 / inTopicNo.3)  Re[2]: リッチテキストボックスの中身を検索する
□投稿者/ OROCHI (7回)-(2009/02/16(Mon) 15:41:24)
回答ありがとうございます

お伺いしたいのですが、この方法はMatchの第1引数で頭につく全てのパターンを入力せねばならないのでしょうか?
実際には検索対象以外のパターンは無数にあるので(真の目的はソースファイル内にある特定の文字列を全て抜き出すこと)、これだといささか厳しいのでは・・・
引用返信 編集キー/
■32839 / inTopicNo.4)  Re[3]: リッチテキストボックスの中身を検索する
□投稿者/ .SHO (675回)-(2009/02/16(Mon) 15:47:07)
No32838 (OROCHI さん) に返信

> 実際には検索対象以外のパターンは無数にあるので(真の目的はソースファイル内にある特定の文字列を全て抜き出すこと)、これだといささか厳しいのでは・・・

"A1 C1 B1 D1 A1_1 A12" → getstringvalue

でしょ。
引用返信 編集キー/
■32846 / inTopicNo.5)  Re[4]: リッチテキストボックスの中身を検索する
□投稿者/ OROCHI (8回)-(2009/02/16(Mon) 16:57:30)
No32839 (.SHO さん) に返信
> ■No32838 (OROCHI さん) に返信
> 
>>実際には検索対象以外のパターンは無数にあるので(真の目的はソースファイル内にある特定の文字列を全て抜き出すこと)、これだといささか厳しいのでは・・・
> 
> "A1 C1 B1 D1 A1_1 A12" → getstringvalue
> 
> でしょ。

ありがとうございました
ただ、新たに別の問題が発覚してしまいました。それは「検索対象文字列の後ろに全角文字が入ると、区切り文字が無効化されてしまう」という問題です。

とりあえずリッチテキストボックスは無視して、以下のようなソースを書きました(検索対象は@h)

 string aa = "xx@hYASHIRO_A201BSクリスー、飯まだかー?";

            Match m = Regex.Match(aa, "(?<moji>@h[\\w_]*)");

            while (m.Success)
            {
                //this.richTextBox1.Text += m.Groups["moji"].ToString().Substring(1) + "\n";
                Console.Write(m.Groups["moji"].ToString().Substring(2) + "\n");
                m = m.NextMatch();
            }

本来ならば@h以降の英数字&アンダーバーということで出力が
YASHIRO_A201BS
となるはずなのですが、何故か
YASHIRO_A201BSクリスー
となり、BS以降の全角文字が何文字か英数文字と認識されてしまいます
この現象はIsLetterOrDigit関数を使っても同様のことが起きてしまいます

こちらの問題は解決する方法はあるのでしょうか?

引用返信 編集キー/
■32850 / inTopicNo.6)  Re[5]: リッチテキストボックスの中身を検索する
□投稿者/ よねKEN (264回)-(2009/02/16(Mon) 17:19:43)
> string aa = "xx@hYASHIRO_A201BSクリスー、飯まだかー?";
>
> Match m = Regex.Match(aa, "(?<moji>@h[\\w_]*)");

この部分を修正して、
Match m = Regex.Match(aa, "(?<moji>@h[\\w]*)",RegexOptions.ECMAScript);
とするか、
Match m = Regex.Match(aa, "(?<moji>@h[a-zA-Z_0-9]*)");
とするとよいと思います。

> 本来ならば@h以降の英数字&アンダーバーということで出力が
> YASHIRO_A201BS
> となるはなのですが、何故か
> YASHIRO_A201BSクリスー
> となり、BS以降の全角文字が何文字か英数文字と認識されてしまいます

.NET Frameworkでの正規表現では、\wは「単語に使用される任意の文字」を意味する文字クラスですので、
英数字だけにマッチするわけではありません。
ECMAScript 準拠の動作を指定した場合は、\w は [a-zA-Z_0-9]と等価だそうです。

↓以下を参照。
文字クラス
http://msdn.microsoft.com/ja-jp/library/20bw873z.aspx
引用返信 編集キー/
■32852 / inTopicNo.7)  Re[6]: リッチテキストボックスの中身を検索する
□投稿者/ OROCHI (9回)-(2009/02/16(Mon) 17:55:26)
No32850 (よねKEN さん) に返信
> .NET Frameworkでの正規表現では、\wは「単語に使用される任意の文字」を意味する文字クラスですので、
> 英数字だけにマッチするわけではありません。
> ECMAScript 準拠の動作を指定した場合は、\w は [a-zA-Z_0-9]と等価だそうです。
>

文字クラスの意味がわかっていなかったようです。
おかげで何とか動作しました。

皆様、ありがとうございました

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -