C#

【C#】特定の文字列を含むか判定する6つの方法

アイキャッチ(c_sharp)

こんにちは。
なかむぅです。

入力された文字の中に禁止文字が入ってないかチェックしたいなぁ。

入力された文字列の中に特定の文字列が入っているかチェックしたい時があります。
たとえば、「ち○ち○」とか「う○こ」とか使ってほしくない文字があるかチェックしたい時とか。

そんなときに使えるチェック方法が大きく6つあったので紹介します。

指定した文字列が含まれているかチェックする

Contains


static void Main(string[] args)
{
	var text = "Hello! World.";
	Console.WriteLine(text.Contains("lo! Wo")); // true
	Console.WriteLine(text.Contains("lo Wo"));  // false
}

IndexOf

あまり見たことないですが、1文字をチェックするならString.Containsより早いらしい。


static void Main(string[] args)
{
	var text = "Hello! World.";
	Console.WriteLine(text.IndexOf("lo! Wo") >= 0); // true
	Console.WriteLine(text.IndexOf("lo Wo") >= 0);  // false
}

String.LastIndexOfでもできます。


static void Main(string[] args)
{
	var text = "Hello! World.";
	Console.WriteLine(text.LastIndexOf("lo! Wo") >= 0); // true
	Console.WriteLine(text.LastIndexOf("lo Wo") >= 0);  // false
}

大文字小文字を区別せずにチェックする

大文字小文字を区別せずにチェックするにはContains、IndexOfともに、第二引数にStringComparison.OrdinalIgnoreCaseを渡します。

Contains


static void Main(string[] args)
{
	var text = "Hello! World.";
	Console.WriteLine(text.Contains("lo! wo", StringComparison.OrdinalIgnoreCase)); // true
	Console.WriteLine(text.Contains("lo! wo"));                                     // false
}

IndexOf


static void Main(string[] args)
{
	var text = "Hello! World.";
	Console.WriteLine(text.IndexOf("lo! wo", StringComparison.OrdinalIgnoreCase) >= 0); // true
	Console.WriteLine(text.IndexOf("lo! wo") >= 0);                                     // false
}

正規表現で複数の文字列をチェックする

Regex.IsMatchを使うと正規表現を使って複数の文字チェックが行えます。

RegexOptions.IgnoreCaseを引数に渡すと大文字小文字は無視されます。


static void Main(string[] args)
{
	var text = "Hello! World.";
	IsMatch(text, "aiueo|lo! Wo|Ne"); // true
	IsMatch(text, "aiueo|lo Wo|Ne");  // false
}

private static void IsMatch(string text, string pattern)
{
	if (Regex.IsMatch(text, pattern, RegexOptions.IgnoreCase))
	{
		Console.WriteLine("いずれかが含まれています。");
	}
	else
	{
		Console.WriteLine("いずれも含まれていません。");
	}
}
結果

いずれかが含まれています。
いずれも含まれていません。

先頭に含まれているかチェックする

先頭しかチェックできません。


static void Main(string[] args)
{
	var text = "Hello! World.";
	Console.WriteLine(text.StartsWith("Hello"));  // true
	Console.WriteLine(text.StartsWith("World.")); // false
}

末尾に含まれているかチェックする

こちらもStartsWithと同様に末尾しかチェックできません。


static void Main(string[] args)
{
	var text = "Hello! World.";
	Console.WriteLine(text.EndsWith("World.")); // true
	Console.WriteLine(text.EndsWith("Hello"));  // false
}

char型で1文字ずつチェックする

String.IndexOfAnyにチェックしたい文字をchar型で渡すと1文字ずつチェックできます。


static void Main(string[] args)
{
	var text = "Hello! World.";
	Console.WriteLine(text.IndexOfAny(new char[] { 'H', 'E', 'L', 'O' }) >= 0); // true
	Console.WriteLine(text.IndexOfAny(new char[] { 'h', 'E', 'L', 'O' }) >= 0); // false
}

その他のチェック

おまけで見つけたチェック方法。

含まれている文字をカウントする


static void Main(string[] args)
{
	var text = "Hello! World.";
	CountChar(text, 'l'); // 3個
	CountChar(text, 'o'); // 2個
}

private static void CountChar(string text, char c)
{
	var count = text.Length - text.Replace(c.ToString(), "").Length;
	Console.WriteLine($"「{c.ToString()}」は {count} 個含まれています");
}
結果

「l」は3個含まれています
「o」は2個含まれています

数字が含まれるかチェックする

IsDigitに1文字ずつ渡して数字が含まれているかどうかチェックする方法。

IsDigitは引数で渡した文字が10進数かどうかを判断してくれるメソッドです。


static void Main(string[] args)
{
	var text = "Hello! World.";
	AnyAndIsDigit("12ab"); // true
	AnyAndIsDigit("abcd"); // false
}

private static void AnyAndIsDigit(string text)
{
	if (text.Any(c => char.IsDigit(c)))
	{
		Console.WriteLine("数字が含まれています");
	}
	else
	{
		Console.WriteLine("数字は含まれていません");
	}
}
結果

数字が含まれています
数字は含まれていません

すべて数字かチェックする

LinqのAllとIsDigitを使って全て数値かどうかチェックできます。


static void Main(string[] args)
{
	var text = "Hello! World.";
	AllAndIsDigit("1234"); // true
	AllAndIsDigit("12ab"); // false
}

private static void AllAndIsDigit(string text)
{
	if (text.All(char.IsDigit))
	{
		Console.WriteLine("数字のみです");
	}
	else
	{
		Console.WriteLine("数字以外が含まれています");
	}
}
結果

数字のみです
数字以外が含まれています


私の会社で一緒に働きませんか?

私が働く会社では、一緒に働いてくれるエンジニアを募集しています♪

こんな人がオススメ
  • 長く働いていても年収が全然上がらない…一気に年収を上げたい
  • 残業をしたくてしているわけではないので、残業代はしっかりと出して欲しい
  • やりたいことに挑戦させてもらえない…自分がしてみたいことに挑戦したい
  • 通勤時間が長すぎるから、できるだけ短くしたい
  • もっと勉強したいから、書籍代や資格の受験料など負担してくれるところに入りたい
  • 現場に駆り出されてからは放置プレイ…相談できる人も先輩も居ないので、自分の状況をちゃんと理解してくれるところで働きたい

上記内容に1つでも当てはまる場合は、ぜひお声がけください。
私のサイトから応募していただいた方にはお好きなギフト券5000円分プレゼントさせていただきます(条件あり)。

詳細ページ


まとめ

  • 指定した文字列が含まれているかチェックするにはContains、IndexOfを使う
  • 大文字小文字を区別せずにチェックするにはStringComparison.OrdinalIgnoreCaseを渡す
  • 正規表現で複数の文字列をチェックするにはRegex.IsMatchを使う
  • StartsWithで先頭に含まれているかチェックする
  • EndsWithで末尾に含まれているかチェックする
  • IndexOfAnyで1文字ずつチェックする
いやここは違うだろ

と思った方はコメントいただけると嬉しいです。

記事で検証したこと以外にも気になることがあればコメントお願いします。

最後までお読みいただきありがとうございました!

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です