- はじめに
- 文字列操作関数
- Left(文字列先頭から指定文字数の文字を取得)
- Right(文字列末尾から指定文字数の文字を取得)
- RemoveLeft(文字列先頭から指定文字数の文字を削除した文字列を取得)
- RemoveRight(文字列末尾から指定文字数の文字を削除した文字列を取得)
- ContainsAny(文字列に指定文字列が含まれているかをチェック)
- ContainsAny(Overload)(文字列に指定文字列が含まれているかをチェック)
- ContainsAll(文字列に指定文字列が全て含まれているかをチェック)
- ContainsAll(Overload)(文字列に指定文字列が全て含まれているかをチェック)
- IsHiragana(文字列がひらがなのみで構成されているかチェック)
- IsKatakana(文字列がカタカナのみで構成されているかチェック)
- IsNumeric(文字列が数字のみで構成されているかチェック)
- IsLowercaseAlphanumeric(文字列が小文字の半角英数字のみで構成されているかチェック)
- IsUppercaseAlphanumeric(文字列が大文字の半角英数字のみで構成されているかチェック)
- IsAlphanumeric(文字列が半角英数字のみで構成されているかチェック)
- 文字列の型変換
- ToMoneyFormat(文字列を,(カンマ)区切り文字列に変換)
- IsNullOrEmpty(文字列がNULLまたは空かチェック)
はじめに
C#に限らずですが、文字列操作はプログラミングをする上で頻繁に行います。
標準で用意されているSystem.Stringクラスのメソッドである程度は対応できるのですが、かゆいところに手が届かないって事ないでしょうか。
ごりへいはそんなよく使用する処理をまとめたライブラリを自作しています。
ここでは文字列操作に関するUtilityな関数を共有したいと思います。
また、文字列操作系は多くの人が作成していると思いますので被っている内容もあるかと思います。
ですがパクリというわけではないので悪しからず。
(参考にしたサイトがある場合、引用として記載します。)
また、掲載しているコードはご自由にコピペしていただいて構いませんが、利用によって生じた損害等の一切の責任を負いかねますのでご了承ください。
(随時更新予定)
文字列操作関数
Left(文字列先頭から指定文字数の文字を取得)
1 2 3 4 5 6 7 8 9 10 |
/// <summary> /// 先頭から指定文字数の文字列を取得します。 /// </summary> /// <param name="str">対象文字列。</param> /// <param name="length">文字数。</param> /// <returns>文字列。</returns> public static string Left(this string str, int length) { return str.Substring(0, length); } |
1 |
Console.Write("abcdefg".Left(3)); // abc |
対象文字列の先頭から指定した文字数の文字列を取得する関数です。
System.string.Substring()をラップした関数ですね。
System.string.Substring()だと文字列を切り取っているのはわかりますが、先頭なのか、途中なのか、最後なのか、引数で判断しなければならないので分かりにくいですし、引数の指定ミスなどでバグになる可能性もあります。
頻繁に使用するので、関数化は必須ですね。
this string strとしているので、stringクラスの拡張メソッドとなっています。
拡張メソッドとは
拡張メソッド – C# プログラミング ガイド | Microsoft Docs
拡張メソッドを使用すると、新規の派生型の作成、再コンパイル、または元の型の変更を行うことなく既存の型にメソッドを “追加” できます。 拡張メソッドは静的メソッドですが、拡張された型のインスタンス メソッドのように呼び出します。 C#、F#、Visual Basic で作成されたクライアント コードの場合は、拡張メソッドの呼び出しと、型で定義されているメソッドの呼び出しに明確な違いはありません。
Right(文字列末尾から指定文字数の文字を取得)
1 2 3 4 5 6 7 8 9 10 |
/// <summary> /// 末尾から指定文字数の文字列を取得します。 /// </summary> /// <param name="str">対象文字列。</param> /// <param name="length">文字数。</param> /// <returns>文字列。</returns> public static string Right(this string str, int length) { return str.Substring(str.Length - length); } |
1 |
Console.Write("abcdefg".Right(3)); // efg |
対象文字列の末尾から指定した文字数の文字列を取得する関数です。
Leftの反対版ですね。
説明はLeftと同じですので、省略します。
RemoveLeft(文字列先頭から指定文字数の文字を削除した文字列を取得)
1 2 3 4 5 6 7 8 9 10 |
/// <summary> /// 文字列の左側から指定した数の文字列を削除して返却します。 /// </summary> /// <param name="str">対象文字列。</param> /// <param name="length">文字数。</param> /// <returns>文字列。</returns> public static string RemoveLeft(this string str, int length) { return str.Substring(length); } |
1 |
Console.Write("abcdefg".RemoveLeft(3)); // defg |
対象文字列の先頭から指定した文字数文字を削除した文字列を取得する関数です。
説明はLeftと同じですので、省略します。
RemoveRight(文字列末尾から指定文字数の文字を削除した文字列を取得)
1 2 3 4 5 6 7 8 9 10 |
/// <summary> /// 文字列の右側から指定した数の文字列を削除して返却します。 /// </summary> /// <param name="str">対象文字列。</param> /// <param name="length">文字数。</param> /// <returns>文字列。</returns> public static string RemoveRight(this string str, int length) { return str.Substring(0, str.Length - length); } |
1 |
Console.Write("abcdefg".RemoveRight(3)); // abcd |
対象文字列の末尾から指定した文字数文字を削除した文字列を取得する関数です。
説明はLeftと同じですので、省略します。
ContainsAny(文字列に指定文字列が含まれているかをチェック)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
/// <summary> /// 文字列に指定した文字列が1つでも含まれているかどうかを判定します。 /// </summary> /// <param name="str">対象文字列</param> /// <param name="ignorecase">true:大文字・小文字を区別しない。false:区別する。</param> /// <param name="sources">対象文字列に含まれているかチェックする文字列</param> /// <returns></returns> public static bool ContainsAny(this string str, bool ignorecase, params string[] sources) { if (string.IsNullOrEmpty(str)) return false; var temp = str; IEnumerable<string> targets = sources; if (ignorecase) { temp = temp.ToUpper(); targets = sources.Select(s => s.ToUpper()); } foreach (var source in targets) { if (temp.Contains(source)) return true; } return false; } |
1 2 |
Console.Write("あいうえおごりへい".ContainsAny("ごりへい","abc","def")); // true Console.Write("あいうえお".ContainsAny("ごりへい","abc","def")); // false |
対象文字列内にsourcesで指定した文字列が1つ以上含まれているかどうかを判定する関数です。
大文字小文字を区別するかどうかを指定出来ます。
IndexOfでは含まれる文字が1つしか指定できないため作りました。
ContainsAny(Overload)(文字列に指定文字列が含まれているかをチェック)
1 2 3 4 5 6 7 8 9 10 11 12 |
/// <summary> /// 文字列に指定した文字列が1つでも含まれているかどうかを判定します。 /// </summary> /// <param name="str">対象文字列</param> /// <param name="ignorecase">true:大文字・小文字を区別しない。false:区別する。</param> /// <param name="sources">対象文字列に含まれているかチェックする文字列</param> /// <returns></returns> public static bool ContainsAny(this string str, bool ignorecase, IEnumerable<string> sources) { if (string.IsNullOrEmpty(str)) return false; return ContainsAny(str, ignorecase, sources.ToArray()); } |
上記のContainsAnyの引数をコレクションにしたものです。
説明は省略します。
ContainsAll(文字列に指定文字列が全て含まれているかをチェック)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
/// <summary> /// 文字列に指定した文字列が全て含まれているかどうかを判定します。 /// </summary> /// <param name="str">対象文字列</param> /// <param name="ignorecase">true:大文字・小文字を区別しない。false:区別する。</param> /// <param name="sources">対象文字列に含まれているかチェックする文字列</param> /// <returns></returns> public static bool ContainsAll(this string str, bool ignorecase, params string[] sources) { if (string.IsNullOrEmpty(str)) return false; var temp = str; IEnumerable<string> targets = sources; if (ignorecase) { temp = temp.ToUpper(); targets = sources.Select(s => s.ToUpper()); } foreach (var source in targets) { if (!temp.Contains(source)) return false; } return true; } |
1 2 |
Console.Write("ごりへい、ブログ、C#".ContainsAll("ごりへい","ブログ","C#")); // true Console.Write("ごりへい".ContainsAll("ごりへい","ブログ","C#")); // false |
対象文字列内にsourcesで指定した文字列がすべて含まれているかどうかを判定する関数です。
大文字小文字を区別するかどうかを指定出来ます。
ContainsAll(Overload)(文字列に指定文字列が全て含まれているかをチェック)
1 2 3 4 5 6 7 8 9 10 11 12 |
/// <summary> /// 文字列に指定した文字列が全て含まれているかどうかを判定します。 /// </summary> /// <param name="str">対象文字列</param> /// <param name="ignorecase">true:大文字・小文字を区別しない。false:区別する。</param> /// <param name="sources">対象文字列に含まれているかチェックする文字列</param> /// <returns></returns> public static bool ContainsAll(this string str, bool ignorecase, IEnumerable<string> sources) { if (string.IsNullOrEmpty(str)) return false; return ContainsAll(str, ignorecase, sources.ToArray()); } |
上記のContainsAllの引数をコレクションにしたものです。
説明は省略します。
IsHiragana(文字列がひらがなのみで構成されているかチェック)
1 2 3 4 5 6 7 8 9 10 |
/// <summary> /// 文字列がひらがなかどうかを判定します。 /// </summary> /// <param name="str">対象文字列。</param> /// <returns>true:ひらがな。false:ひらがな以外。</returns> public static bool IsHiragana(this string str) { if (string.IsNullOrEmpty(str)) return false; return Regex.IsMatch(str, @"^\p{IsHiragana}+$"); } |
1 2 |
Console.Write("ごりへい".IsHiragana()); // true Console.Write("ゴリヘイ".IsHiragana()); // false |
対象文字列がひらがなかどうかを判定する関数です。
こちらは以下のサイトを参考にした記憶があります。
U+3040からU+309Fまでは「Hiragana」というブロック名が付いています。よって任意のひらがな1文字を表す正規表現パターンとして、「\p{IsHiragana}」が使えます。
文字がひらがなか、カタカナか、漢字か、英数字か調べる – .NET Tips (VB.NET,C#…) (dobon.net)
U+30FCの「ー」(長音記号)とU+30A0の「゠」(ダブルハイフン)が含まれていませんので、これをひらがなと判断したい場合は気をつけてください。
U+30FCの「ー」(長音記号)とU+30A0の「゠」(ダブルハイフン)はひらながと判定しませんので、注意が必要です。
IsKatakana(文字列がカタカナのみで構成されているかチェック)
1 2 3 4 5 6 7 8 9 10 |
/// <summary> /// 文字列がカタカナかどうかを判定します。 /// </summary> /// <param name="str"></param> /// <returns></returns> public static bool IsKatakana(this string str) { if (string.IsNullOrEmpty(str)) return false; return Regex.IsMatch(str, @"^[\p{IsKatakana}\u31F0-\u31FF\u3099-\u309C\uFF65-\uFF9F]+$"); } |
1 2 |
Console.Write("ゴリヘイ".IsKatakana()); // true Console.Write("ごりへい".IsKatakana()); // false |
対象文字列がカタカナかどうかを判定する関数です。
こちらもIsHiraganaと同様のサイトを参考にしたと思います。
IsNumeric(文字列が数字のみで構成されているかチェック)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
/// <summary> /// 文字列が数字かどうかを判定します。 /// </summary> /// <param name="str">対象の文字列</param> /// <param name="isDigit">小数点を認めるかどうか</param> /// <param name="isSymbol">負の記号を認めるかどうか</param> /// <returns></returns> public static bool IsNumeric(this string str, bool isDigit = true, bool isSymbol = true) { if (string.IsNullOrEmpty(str)) return false; // 小数点、負の記号有り if (isDigit && isSymbol) { return new Regex("^[-]?[0-9]+(\\.[0-9]+)?$").IsMatch(str); } // 小数点有り else if (isDigit) { return new Regex("^[0-9]+(\\.[0-9]+)?$").IsMatch(str); } // 負の記号有り else if (isSymbol) { return new Regex("^[-]?[0-9]+$").IsMatch(str); } // 小数点、負の記号無し else { return new Regex("^?[0-9]+$").IsMatch(str); } } |
1 2 |
Console.Write("12345".IsNumeric()); // true Console.Write("abc123".IsNumeric()); // false |
対象文字列が数字のみで構成されているかどうかを判定する関数です。
小数点を認めるか、負の記号を認めるか引数で指定出来ます。
IsLowercaseAlphanumeric(文字列が小文字の半角英数字のみで構成されているかチェック)
1 2 3 4 5 6 7 8 9 10 |
/// <summary> /// 文字列が小文字の半角英数字かどうかを判定します。 /// </summary> /// <param name="str">対象の文字列</param> /// <returns>文字列が小文字の英数字の場合はtrue、それ以外はfalse</returns> public static bool IsLowercaseAlphanumeric(this string str) { if (string.IsNullOrEmpty(str)) return false; return new Regex("^[0-9a-z]+$").IsMatch(str); } |
1 2 |
Console.Write("abcd12345".IsLowercaseAlphanumeric()); // true Console.Write("ABCD12345".IsLowercaseAlphanumeric()); // false |
対象文字列が小文字の半角英数字のみで構成されているかどうかを判定する関数です。
IsUppercaseAlphanumeric(文字列が大文字の半角英数字のみで構成されているかチェック)
1 2 3 4 5 6 7 8 9 10 |
/// <summary> /// 文字列が大文字の半角英数字かどうかを判定します。 /// </summary> /// <param name="str">対象の文字列</param> /// <returns>文字列が大文字の英数字の場合はtrue、それ以外はfalse</returns> public static bool IsUppercaseAlphanumeric(this string str) { if (string.IsNullOrEmpty(str)) return false; return new Regex("^[0-9A-Z]+$").IsMatch(str); } |
1 2 |
Console.Write("ABCD12345".IsUppercaseAlphanumeric()); // true Console.Write("abcd12345".IsUppercaseAlphanumeric()); // false |
対象文字列が大文字の半角英数字のみで構成されているかどうかを判定する関数です。
IsAlphanumeric(文字列が半角英数字のみで構成されているかチェック)
1 2 3 4 5 6 7 8 9 10 11 |
/// <summary> /// 文字列が半角英数字かどうかを判定します。 /// </summary> /// <remarks>大文字・小文字を区別しません</remarks> /// <param name="str">対象の文字列</param> /// <returns>文字列が英数字の場合はtrue、それ以外はfalse</returns> public static bool IsAlphanumeric(this string str) { if (string.IsNullOrEmpty(str)) return false; return new Regex("^[0-9a-zA-Z]+$").IsMatch(str); } |
1 2 |
Console.Write("123abc".IsAlphanumeric()); // true Console.Write("WWWW123".IsAlphanumeric()); // false |
対象文字列が半角英数字のみで構成されているかどうかを判定する関数です。
文字列の型変換
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
/// <summary> /// 文字列を<see cref="int">型に変換します。 /// 変換できない場合はデフォルト値を返却します。 /// </see></summary> /// <param name="str">文字列 /// <param name="defaultValue">デフォルト値 /// <returns></returns> public static int ToInt(this string str, int defaultValue = default) { return int.TryParse(str, out int value) ? value : defaultValue; } /// <summary> /// 文字列を<see cref="uint">型に変換します。 /// 変換できない場合はデフォルト値を返却します。 /// </see></summary> /// <param name="str">文字列 /// <param name="defaultValue">デフォルト値 /// <returns></returns> public static uint ToUInt(this string str, uint defaultValue = default) { return uint.TryParse(str, out uint value) ? value : defaultValue; } /// <summary> /// 文字列を<see cref="short">型に変換します。 /// 変換できない場合はデフォルト値を返却します。 /// </see></summary> /// <param name="str">文字列 /// <param name="defaultValue">デフォルト値 /// <returns></returns> public static short ToShort(this string str, short defaultValue = default) { return short.TryParse(str, out short value) ? value : defaultValue; } /// <summary> /// 文字列を<see cref="ushort">型に変換します。 /// 変換できない場合はデフォルト値を返却します。 /// </see></summary> /// <param name="str">文字列 /// <param name="defaultValue">デフォルト値 /// <returns></returns> public static ushort ToUShort(this string str, ushort defaultValue = default) { return ushort.TryParse(str, out ushort value) ? value : defaultValue; } /// <summary> /// 文字列を<see cref="long">型に変換します。 /// </see></summary> /// <param name="str">文字列 /// <param name="defaultValue">デフォルト値 /// <returns></returns> public static long ToLong(this string str, long defaultValue = default) { return long.TryParse(str, out long value) ? value : defaultValue; } /// <summary> /// 文字列を<see cref="ulong">型に変換します。 /// </see></summary> /// <param name="str">文字列 /// <param name="defaultValue">デフォルト値 /// <returns></returns> public static ulong ToULong(this string str, ulong defaultValue = default) { return ulong.TryParse(str, out ulong value) ? value : defaultValue; } /// <summary> /// 文字列を<see cref="float">型に変換します。 /// </see></summary> /// <param name="str">文字列 /// <param name="defaultValue">デフォルト値 /// <returns></returns> public static float ToFloat(this string str, float defaultValue = default) { return float.TryParse(str, out float value) ? value : defaultValue; } /// <summary> /// 文字列を<see cref="double">型に変換します。 /// 変換できない場合はデフォルト値を返却します。 /// </see></summary> /// <param name="str">文字列 /// <param name="defaultValue">デフォルト値 /// <returns></returns> public static double ToDouble(this string str, double defaultValue = default) { return double.TryParse(str, out double value) ? value : defaultValue; } /// <summary> /// 文字列を<see cref="bool">型に変換します。 /// 変換できない場合はデフォルト値を返却します。 /// </see></summary> /// <param name="str">文字列 /// <param name="defaultValue">デフォルト値 /// <returns></returns> public static bool ToBool(this string str, bool defaultValue = default) { return bool.TryParse(str, out bool value) ? value : defaultValue; } /// <summary> /// 文字列を<see cref="decimal">型に変換します。 /// 変換できない場合はデフォルト値を返却します。 /// </see></summary> /// <param name="str"> /// <param name="defaultValue">デフォルト値 /// <returns></returns> public static decimal ToDecimal(this string str, decimal defaultValue = default) { return decimal.TryParse(str, out decimal value) ? value : defaultValue; } /// <summary> /// 文字列を<see cref="DateTime">型に変換します。 /// 変換出来ない場合はデフォルト値を返却します。 /// </see></summary> /// <param name="str"> /// <param name="defaultValue">デフォルト値 /// <returns></returns> public static DateTime ToDateTime(this this string str, DateTime defaultValue = default) { return DateTime.TryParse(str, out DateTime result) ? result : defaultValue; } |
1 2 3 4 5 6 7 8 9 10 11 12 |
int.MaxValue.ToString().ToInt() == int.MaxValue; // true uint.MaxValue.ToString().ToUInt() == uint.MaxValue; // true short.MaxValue.ToString().ToShort() == short.MaxValue; // true ushort.MaxValue.ToString().ToUShort() == ushort.MaxValue; // true long.MaxValue.ToString().ToLong() == long.MaxValue); // true ulong.MaxValue.ToString().ToULong() == ulong.MaxValue; // true float.MaxValue.ToString().ToFloat() == float.Parse(float.MaxValue.ToString()); // true "123456789.34567".ToDouble() == 123456789.34567d; // true decimal.MaxValue.ToString().ToDecimal() == decimal.MaxValue; // true "true".ToBool(); // true "false".ToBool(); // false DateTime.MaxValue.ToString().ToDateTime().ToString("yyyy/MM/dd HH:mm:ss") == DateTime.MaxValue.ToString("yyyy/MM/dd HH:mm:ss"); // true |
文字列型から組み込み型への型変換関数です。
Float,Doubleは最大値でToString()→変換とすると桁落ちして元の値と同じではなくなります。(言語仕様)
また、当然と言えば当然ですが、DateTime型は”2022/01/01 12:12:12″という文字列をParseしても内部のTickまでは当然変換されないため、DateTime.Compare()としてもfalseになります。
年月日時間以下の詳細な情報を変換する必要がある場合はご注意ください。
ToMoneyFormat(文字列を,(カンマ)区切り文字列に変換)
1 2 3 4 5 6 7 8 9 10 11 12 |
/// <summary> /// 文字列をカンマ区切りに整形して返却します。 /// 文字列が空またはnullの場合は空文字を返却します。 /// </summary> /// <param name="str">文字列</param> /// <returns>カンマ区切り文字列</returns> public static string ToMoneyFormat(this string str) { if (string.IsNullOrEmpty(str)) return ""; return $"{str:#,0}"; } |
1 |
Console.Write("9999999999".ToMoneyFormat()); // 9,999,999,999 |
対象文字列を,(カンマ)区切りに変換する関数です。
IsNullOrEmpty(文字列がNULLまたは空かチェック)
1 2 3 4 5 6 7 8 9 |
/// <summary> /// 指定された文字列が null または System.String.Empty 文字列であるかどうかを示します。 /// </summary> /// <param name="value">テストする文字列。</param> /// <returns>true パラメーターが value または空の文字列 ("") の場合は null。それ以外の場合は false。</returns> public static bool IsNullOrEmpty(this string value) { return string.IsNullOrEmpty(value); } |
1 2 3 4 5 |
var str = "abc"; if(str.IsNullOrEmpty()) Console.Write("文字列はNULLまたは空です。"); else Console.Write("文字列はNULLまたは空ではありません。"); |
stringクラスのIsNullOrEmptyメソッドの拡張メソッドになります。
string.IsNullOrEmpty(変数) ではなく、 変数.IsNullOrEmpty() と記載するためだけに作りました。
コメント