今回は文字列操作編!
そういえば、会社の研修でJavaを勉強し始めた当初、文字列の比較のやり方がわからなくて、かなりつまづいたな。
結局、10才近く年下の子にやり方教えてもらったのは、いい思い出です。
文字列の比較
C#での文字列比較をやっていきます。
まず、これが一番シンプルな比較方法。大文字小文字も区別される。
if (str1 == str2)
次が、大文字小文字の区別なく比較する方法。
3つ目の引数のtrueが、大文字小文字の区別なく比較することを表している。
if (String.Compare(str1, str2, ignoreCasetrue) == 0)
ひらがなとカタカナを区別なく、比較することも可能。
var str1 = "カステラ"; var str2 = "かすてら"; var cultureInfo = new CultureInfo("ja-JP"); if(String.Compare(str1, str2, cultureInfo, CompareOptions.IgnoreKanaType) == 0)
全角半角の区別なく比較するには
var str1 = "HTML5"; var str2 = "HTML5"; var cultureInfo = new CultureInfo("ja-JP"); if(String.Compare(str1, str2, cultureInfo, CompareOptions.IgnoreWidth) == 0)
また、String.Compareメソッドの第3引数は論理演算子で繋げることも可能で
var str1 = "Html5"; var str2 = "HTML5"; var cultureInfo = new CultureInfo("ja-JP"); // 大文字小文字と全角半角の区別なく比較 if (string.Compare(str1, str2, cultureInfo, CompareOptions.IgnoreWidth | CompareOptions.IgnoreCase) == 0)
文字列の判定
nullあるいは空文字かを判定。これはよく使いそう。
if(String.IsNullOrEmpty(str))
空文字かを判定する。
if(str == String.Empty)
nullか空文字か空白文字列かを判定する。空白文字列も判定できるのか。
if(String.IsNullOrWhiteSpace(str))
指定した文字列で始まっているか。
if(str.StartsWith("Visual"))
指定した文字列で終わっているか。
if(str.EndsWith("Exception"))
指定した部分文字列が含まれているか。
if(str.Contains("Program"))
上記は文字列だったが、文字が含まれているかを調べるには、LINQを使う。
var target = "The quick brown fox jumps over the lazy dog."; var contains = target.Contains('b');
次もまたLINQ。条件を満たしている文字が含まれているか。
var target = "C# Programming"; // 小文字が含まれているかチェック var isExists = target.Any(c => Char.IsLower(c));
上記はどれか1文字でも条件を満たしているかどうかのチェックだったが、今度はすべての文字が条件を見てしているかをチェックする。
var target = "141421536"; // 数字かどうかをチェック var isAllDigits = target.All(c => Char.IsDigit(c));
文字列の検索と抽出
部分文字列を検索し、その位置を求める。
var target = "NameList;BirthdayList"; var index = target.IndexOf("BirthdayList");
文字列の一部を取り出す。
// 指定した位置から最後までを部分文字列として取り出す var value = target.Substring(index);
取り出す長さを指定することもできる.
var value = target.Substring(index, endIndex - startIndex);
文字列の変換
文字列の前後の空白を取り除く。
var replaced = target.Trim();
文字列の前後片方だけの空白を取り除く。
var replaced1 = target.TrimStart(); var replaced2 = target.TrimEnd();
指定した位置から任意の数の文字を削除する。
var result = target.Remove(5, 3);
指定した位置に文字列を挿入する。
var target = "01234"; // 01abc234が出力される var result = target.Insert(2, "abc");
文字列の一部を別の文字列で置き換える。
var target = "I hope you could come to with us."; // I wish you could come to with us.と出力される。 var replaced = target.Replace("hope", "wish");
小文字を大文字に変換する。
var replaced = target.ToUpper();
大文字を小文字に変換する。
var replaced = target.ToLower();
文字列の連結と分割
var name = "山田" + "太郎";
文字列の末尾に追加する。
var name = "やまだ"; name += "先生";
指定した区切り文字で文字列配列を連結する。
var languages = new[]{"C#", "Java", "VB", "Ruby", }; var separator = ","; // C#, Java, VB, Rubyと出力される var result = String.Join(separator, languages); 指定した文字で文字列を分割する。 >|cs| var target = "I hope you could come to with us."; // 空白文字で分割する string[] words = target.Split(' ');
なお、空の配列要素を含めないようにするには、以下の書き方が必要。
var target = "I hope you could come to with us."; // 空白文字で分割する string[] words = target.Split(new [] {' ', '.'}, StringSplitOptions.RemoveEmptyEntries);
文字列は基本的に普変オブジェクトである。そのため、文字連結を行うたびに、新たなインスタンスを生成していることになる。
そこで、StringBuilderを使った文字連結がある。StringBuilderクラスは、インスタンス生成時に、文字列を格納する領域を確保し、その領域を超えて文字列を追加しようとした場合は、自動的に容量が増えていく。そのため、無駄なインスタンスを生成する必要がない。
var sb = new StringBuilder(); foreach (var word in GetWords()) { sb.Append(word); } // 文字列に変換 var text = sb.ToString();
その他の文字列操作
文字列から文字を1つずつ取り出すには、foreach文を使う。
foreach (var c in str) { }
文字配列から文字列を生成する。
var chars = new char[] {'P', 'r', 'o', 'g', 'r', 'a', 'm' }; var str = new string(chars);
数値を文字列に変換するには、ToStringメソッドを使用する。
ToStringメソッドには、さまざまな書式指定を引数で行えるが、多すぎるのでここでは割愛する。
指定した書式で文字列を整形するには、String.Formatメソッドを使用する。
var novelist = "やまだ"; var bestWork = "春麗"; var bookline = String.Format("Novelist={0};BestWork={1}", novelist, bestWork);