(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!

    

文字列を比較する際に大文字小文字を区別しない、全角半角を区別しない、ひらがなカタカナを区別しない、空白や記号を無視を無視する【C#】


このエントリーをはてなブックマークに追加


はじめに

C#で文字列を比較する際は、普通は全角半角やひらがなカタカナを区別しませんが、

//てきすと と テキスト が同じ文字列か比較
var text1 = "てきすと";
var text2 = "テキスト";
    
//そのまま比較したら、もちろん違う文字列と判定
Debug.Log($"{text1} と {text2} の比較 {text1 == text2}");


場合によってはこれらを区別せずに同じ文字列として扱いたい事もあります。

今回はそんな時に役立つ記事です!


なお、Unityでの使用を想定しているためDebugを使っています。


CompareInfo

CompareInfoというクラスとCompareOptionsという列挙型を使います。




使い方は、現在の言語のCompareInfoを取得し、比較したい文字列を指定してCompareを実行するだけ。

その際にCompareOptionsで比較する条件を指定する感じです。

//現在の言語のCompareInfoを取得
var compareInfo = CultureInfo.CurrentCulture.CompareInfo;

//比較条件を設定(複数ある場合は|でつなぐ)
var compareOptions =
  CompareOptions.IgnoreCase | //大文字小文字を区別しない ("a"と"A"は等しい。)
  CompareOptions.IgnoreWidth | //全角半角を区別しない ("A"と"A"は等しい。"ア"と"ア"は等しい。)
  CompareOptions.IgnoreKanaType | //ひらがなカタカナを区別しない ("あ"と"ア"は等しい。)
  CompareOptions.IgnoreSymbols; //空白や記号を無視する ("aa"と"a a"は等しい。"あ"と"あ。"は等しい。"abcd"と"%a$b\c=d+"は等しい)
    
//てきすと と テキスト が同じ文字列か比較
var text1 = "てきすと";
var text2 = "テキスト";
    
//Compareの返り値が0なら等しい
Debug.Log($"{text1} と {text2} の比較 {compareInfo.Compare(text1, text2, compareOptions) == 0}");


ちなみに文字列が含まれているかを判定する時はindexofで0以上かをチェックします。

(空文字でも0が返ってくる点には注意)

//比較条件を設定(複数ある場合は|でつなぐ)
var compareInfo = CultureInfo.CurrentCulture.CompareInfo;

//比較条件を設定(複数ある場合は|でつなぐ)
var compareOptions =
  CompareOptions.IgnoreCase | //大文字小文字を区別しない ("a"と"A"は等しい。)
  CompareOptions.IgnoreWidth | //全角半角を区別しない ("A"と"A"は等しい。"ア"と"ア"は等しい。)
  CompareOptions.IgnoreKanaType | //ひらがなカタカナを区別しない ("あ"と"ア"は等しい。)
  CompareOptions.IgnoreSymbols; //空白や記号を無視する ("aa"と"a a"は等しい。"あ"と"あ。"は等しい。"abcd"と"%a$b\c=d+"は等しい)
  
//あAbCd の中に abc が含まれているかチェック  
var text1 = "あAbCd";
var text2 = "abc";
    
//IndexOfの返り値が0以上なら含んでいる
Debug.Log($"{text1} は {text2} を含んでいるか {compareInfo.IndexOf(text1, text2, compareOptions) >= 0}");