Stringクラスとは
String
クラスは、文字列(テキスト)を扱うためのクラスです。文字列は変更できない(イミュータブル)オブジェクトであり、一度作成された文字列は変更できません。代わりに、新しい文字列を生成します。文字列の加工/整形、部分文字列の検索/取得など、文字列の操作に関わる機能を持っています。
文字列の長さを取得する
文字列の長さはLengthプロパティで取得します。
string str = "Hello World!";
int length = str.Length;//文字列の長さを取得する
たまに、文字数とLengthプロパティが異なる値を返してくることがありますが、よほど変な文字コードを送り込まない限り安心して使用してください。
どうしてもそのような文字列を扱わなければ行けなくなった場合は、以下の様なコードがあります。
using System.Globalization;//StringInfoの属する名前空間
string str = "a\u0304\u0308bc\u0327";// ā̈bçと書いてある3文字の文字列
Console.WriteLine(str.Length); //6と表示される
StringInfo info = new StringInfo(str);//StringInfoクラスを使用する
Console.WriteLine(info.LengthInTextElements);//正しく3と常時される
StringInfoクラスはSystem.Globalization名前空間にあるので、usingで指定することを忘れないようにしてください。インスタンス化する時に対象の文字列を渡すだけです。
今後は、このようなLengthプロパティと本来の文字数とが一致しない文字列は扱わないものとします。
文字列を大文字小文字を区別しないで比較する
「==」演算子による文字列比較のお話は前にもしましたが、これは大文字と小文字を区別して文字列を比較しています。大文字・小文字を区別しないで比較する場合は以下の様にします。
string str1 = "abc";
string str2 = "ABC";
Console.WriteLine(str1.Equals(str2));// 大文字小文字を区別するのでfalseと表示される
Console.WriteLine(str1.Equals(str2, StringComparison.OrdinalIgnoreCase));//大文字小文字を区別しないのでtrueと表示される
文字列を検索する
文字列を検索するためには、IndexOfとLastIndexOfメソッドがあります。
IndexOfメソッドは以下の通りになります。
見つからなければ-1を返し、見つかった場合は最初に見つかった文字の位置を返します。但し、文字の位置は先頭を0とした値です。
string str = "abcdeabcde";
Console.WriteLine(str.IndexOf("ab")); //先頭から単純に文字列を探します。結果は0
Console.WriteLine(str.IndexOf("ba"));//見つからなかったので結果は-1
COnsole.WriteLine(str.IndexOf("ab",3));//3番目(4文字目)から文字列を検索する。結果は5
Console.WriteLine(str.IndexOf("ab",4,4));//4番目から4文字分をで文字列を検索する。結果は5
Console.WriteLine(str.IndexOf("ab",5,10));//範囲外の数値を検索対象にしているためArgumentOutOfRangeExceptionが発生する
LastIndexOfメソッドも殆ど同じような使い方をします。戻り値はあくまで先頭からのインデックスを返してくれることに注意が必要です。
ここで一つ疑問に思ったことがある人は勘がいいです。同じIndexOfメソッドでも引数の数が違うのに同じメソッド名で大丈夫なのかと。オブジェクト指向の話に深入りしない範囲でここで解説します。
実は、同一のメソッド名で、引数の数や型を変えたりするのはメソッドのオーバーロードと呼ばれています。引数の数、型が同一で戻り値だけが変化するのは不可となっています。
3行目は先頭から指定した文字数分まで検索せよとあったのが、5行目は先頭のインデックスのみを指定し、6行目は先頭と最後のインデックスを指定しています。それでは逆に文字数のみを指定することは残念ながら出来ません。int型の数値が2つあれば先頭と文字数と区別がつきますが、1つだと先頭なのか文字数なのかが分かりません。従って決めの問題で先頭とするよう内部処理がなされています。
部分文字列を取得する
Substringメソッドで指定した文字列の場所から文字数分を抜き出すものです。
string str1 = "abcdef";
Console.WriteLine(str1.Substring(3));//str1の3番目から全部の文字を取得するため、結果はdef
Console.WriteLine(str1.Substring(3,2));//str1の3番目から2文字を取得するため、結果はde
文字列を特定の区切り文字で分割する
Splitメソッドを用います。
string str1 = "ab cd ef";
string[] str2 = str1.Split(' ');//スペースで区切った文字列を配列に格納する
foreach(string ret in str2){//区切られた文字列を1つずつ画面に表示する
Console.WriteLine(ret);
}
まとめ
今回は文字列の操作について学んできました。簡単なものだけを取り上げましたが、Stringクラスには説明しきれないほど色々な機能があります。
気になった方は書籍を手に取るか、Microsoft社の作成しているサイトを覗いてみてください。
練習問題を何問か用意します。是非解いてみてください。
コメント