今日は初心者向けのコンテンツです。Google サーチコンソールをみていると自分のサイトが検索結果に表示されるとき、どんなキーワードで検索されてどれくらいの順位がついているのか、実際にアクセスした人はどれくらいいるのかがわかります。
すると頑張ってオンラインゲームのようなものをつくっても、肝心の検索する人がいないので(「C# オンラインゲーム 作り方」みたいなのならあるかも)、検索需要にマッチしたコンテンツをつくることにしました。これまでに書いた記事のタイトルを見直すと「C#を使ったオンラインゲームの作り方」のようなタイトルの記事がありません。これでは独りよがりというものです。
ということで、初心に帰れ第一弾では「文字列を分割する方法」を解説します。
文字列を分割して出力する
“This is a pen.”のような文字列を半角スペースで分割して出力する方法を考えます。
以下の方法で実現できます。分割したい文字列を変数(この場合はphrase)に格納してphrase.Split(‘ ‘)とやればOKです。あと半角スペースで分割するのであればphrase.Split()と引数なしでも同じ結果が得られます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
using System; class Program { static void Main() { string phrase = "This is a pen."; string[] words = phrase.Split(' '); foreach (var word in words) Console.WriteLine(word); } } |
実行結果
1 2 3 4 |
This is a pen. |
Splitメソッドの引数は1文字だけでなく複数文字であってもかまいません。
1 2 |
string str1 = "ThisXYZisXYZaXYZpen."; string[] words1 = str1.Split("XYZ"); |
それからタブ文字でも使えます。
1 2 |
string str2 = "This is a pen."; string[] words2 = str2.Split("\t"); |
改行が入っていても使えます。たとえばテキストファイルを読み込んでこれを1行ずつ出力することもできます。
ただし注意点があります。それは改行コードが”\r\n”と”\n”と”\r”の場合があるからです。Mac OS(9以前)なら”\r”、 Windows系全般は”\r\n”、UNIX系全般は”\n”です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
using System; class Program { static void Main() { System.IO.StreamReader reader = new System.IO.StreamReader(@"D:\text.txt"); string str3 = reader.ReadToEnd(); reader.Close(); string[] words3 = str3.Split("\r\n"); // Windowsなら int lineNumber = 1; foreach (var word in words3) { Console.WriteLine($"{lineNumber}行目:{word}({word.Length})"); // Console.WriteLine(lineNumber + "行目:" + word + "(" + word.Length + ")"); でもよいが面倒くさい lineNumber++; } } } |
このような切り分けが面倒なので単にテキストファイルから一行ずつ標準出力で出力したいのであれば以下のようなコードが推奨されているのです。これなら改行コードがどうなっていても対応できます。ただ文字列の分割という今回のテーマとは外れてしまいますが・・・。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using System; class Program { static void Main() { System.IO.StreamReader reader = new System.IO.StreamReader(@"D:\text.txt"); string s; int lineNumber = 1; while ((s = reader.ReadLine()) != null) { Console.WriteLine($"{lineNumber}行目:{s}({s.Length})"); lineNumber++; } } } |
また文字で分割する場合、その文字を配列で指定することもできます。
1 2 3 |
string str = "This is a pen.That is a pencil."; char[] arr = { ' ', '.'}; string[] words = str.Split(arr); |
また複数の文字列で分割することも可能ですが、その場合は引数がもうひとつ必要です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
using System; class Program { static void Main() { string str = "This is a pen. That is a pencil."; string[] arr = { " " , "." }; // 文字列の配列 string[] words = str.Split(arr, StringSplitOptions.None); // 第二引数が必要 foreach (string word in words) Console.WriteLine(word); } } |
出力結果
1 2 3 4 5 6 7 8 9 |
This is a pen That is a pencil |
空白の行がありますが、これは半角スペースと”.”で分割したため半角スペースと”.”が連続している部分では分割で生成された文字列が空だったからです。第二引数をStringSplitOptions.NoneからStringSplitOptions.RemoveEmptyEntriesに変更すると分割の結果、空文字列ができると配列(この場合はwords)には格納されません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
using System; class Program { static void Main() { string str = "This is a pen. That is a pencil."; string[] arr = { " " , "." }; string[] words = str.Split(arr, StringSplitOptions.RemoveEmptyEntries); // ここを変更した foreach (string word in words) Console.WriteLine(word); } } |
出力結果
1 2 3 4 5 6 7 8 |
This is a pen That is a pencil |
二つの文字列で挟まれた文字列を取得する
“123<<456>>789″のような文字列が与えられたら<<と>>で挟まれた文字列を取得する方法を考えます。もし<<と>>は文字列のなかに存在し、<<、>>の順に出現することが保証されているのであれば、この文字列で分割して2番目のもの(この例ならwords[1])を取得すればよいことになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
using System; class Program { static void Main() { string str = "123<<456>>789"; string[] arr = { "<<", ">>" }; string[] words = str.Split(arr, StringSplitOptions.None); Console.WriteLine(words[1]); } } |
文字列の計算式を計算させる
応用編で文字列の計算式を計算させてみます。”1+2+3″を入力すると”6″が出力されるようなコードを書いてみます。
やっていることは”+”で分割すると数字になるので、これをdouble.Parseメソッドでdouble型に変換してこれを加算処理しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System; class Program { static void Main() { string str = "1+2+3.5"; string[] words = str.Split("+"); double ret = 0; foreach (string word in words) { double value = double.Parse(word); ret += value; } Console.WriteLine(ret); // 6.5 } } |
では引き算が混在する式の場合はどうすればいいのでしょうか?
引き算が混在する場合はすべて足し算になるように”-“を “+-“に置換します。要は負数の足し算になるようにするわけです。あとは上記と同じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
class Program { static void Main() { string str = "1-2+3-4"; str = str.Replace("-", "+-"); string[] words = str.Split("+"); double ret = 0; foreach (string word in words) { double value = double.Parse(word); ret += value; } Console.WriteLine(ret); // -2 } } |