DOBON.NET DOBON.NETプログラミング掲示板過去ログ

C#textBox上での文字列の分割

分類:[.NET]

先日はお世話になりました。
win2000pro,VS2005C#です。

FormにtextBoxコントロールを一つとボタンを一つ配置しています。
textBoxはMultiLine=Trueとなっています。

複数行表示のtextBox上の複数行の文字列を、行によって分割したいのですが、
一応出来たのですが、納得できないので質問させて下さい。

一応出来たコードです。
ボタンのクリックイベントで、
String[] str_1 = textBox1.Text.Split("\n");

これでtextBoxの内容が
a
b
c
となっていれば、
Console.WriteLine(str_1[1]);
でbと表示されるのですが、
Windows上での改行コードは、「\r\n」ではないのか?というのが気になっています。
ためしに
textBox1 = "a\nb\nc\n";
としても、
a
b
c
とはならずに
a・b・cのように\nは改行されずに・と文字化けしてしまっています。
にもかかわらず、Split("\n")でうまくいっているようにみえます。
これはどうしてなのでしょうか?
本来ならSplit("\r\n")としたいのですが、
「文字リテラルに文字が多すぎます」
とエラーが表示されます。

いまのところ問題はなさそうですが、しっくりきません。
String.Splitメソッドのヘルプを読みましたが、これに関連した記述は
発見できませんでした。
Split("\r\n") でだめなのは、Split で分割に使う文字列は、
1文字分に規定されているからです。

> Windows上での改行コードは、「\r\n」ではないのか?というのが気になっています。

その通りです。ですから \r\n を一旦 \n に置き換えて、
その後 Split("\n") で分割するとか。

以下のページを参照して下さい。
http://dobon.net/vb/dotnet/vb2cs/vbsplit.html
TextBox には Lines プロパティがありますよ。
Hongliangさん Wrote:
> TextBox には Lines プロパティがありますよ。

そちらのほうが適切ですね、すいません。

以下のページに載ってました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=14251&forum=7
MSDNを見るとわかりますが
> String[] str_1 = textBox1.Text.Split("\n");
この場合の Split は String.Split(Char[]) なので、"\n" は許されないのではないかと思います。
たぶん '\n' の誤記かもしれませんが。

> Windows上での改行コードは、「\r\n」ではないのか?というのが気になっています。

これは確かにWindows上の改行コードは(一般的には)「\r\n」です。
少なくとも Multiline = true にした場合の改行コードは「\r\n」で間違いないと思います。

> a・b・cのように\nは改行されずに・と文字化けしてしまっています。
> にもかかわらず、Split("\n")でうまくいっているようにみえます。
> これはどうしてなのでしょうか?

これは推測どおり \n が改行として認識されていないからです。
コントロールコードとして表示されているのですね。
うまくいっているように見えるのは、 \r が表示されていないためだと思われます。

> 本来ならSplit("\r\n")としたいのですが、
> 「文字リテラルに文字が多すぎます」
> とエラーが表示されます。

上記のとおり、String.Split() は基本的に Char[] を使用するので、"\r\n" ではこのようなエラーが返ります。
この場合は Regex.Split() を使用するといいかもしれません。

Regex reg = new Regex("\r\n");
String[] str_1 = reg.Split(textBox1.Text);

こんな感じですね。

ただ、Hongliangさんがおっしゃられているように TextBox には
Lines プロパティがありますので、そちらを使われるのがいいでしょう。
まとめてお礼で失礼いたします。

Hongliangさんありがとうございます。
LinesプロパティをGetValueなどでいじくって解決いたしました。

CSamuraさんありがとうございます。
リンクとても参考になりました。

ぽぴ王子さん、ありがとうございます。
""で囲んだ文字はString型、''で囲んだ文字はchar型という認識でよいでしょうか?
質問文では誤記してしまいました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板