web-dev-qa-db-ja.com

大文字と小文字を区別しない 'Contains(string)'

次のように返す方法はありますか?

string title = "ASTRINGTOTEST";
title.Contains("string");

大文字と小文字の区別を設定することを可能にする過負荷があるように思われません。現在私は両方とも大文字にしますが、それはただ愚かなことです(それによって私はup-付属する i18n 問題を言及します)。そしてダウンケーシング)。

_ update _
この質問は古くからあります。それ以来、あなたがそれを十分に調査したいのであれば、私は本当に広大で難しい話題について簡単な答えを求めたことに気づきました。
ほとんどの場合、単言語の英語コードベースでは{ this answerで十分です。ここに来るほとんどの人がこのカテゴリに入るので、これは最も人気のある答えです。
This answerは、両方のテキストが同じ文化であり、その文化が何であるかを知るまで、大文字と小文字を区別しないでテキストを比較できないという固有の問題を引き起こします。これはあまり一般的ではない答えかもしれませんが、私はそれがより正しいと思うので、そのようにマークしました。

2658
Boris Callens

文字列paragraphに文字列Wordが含まれているかどうかをテストするには(@QuarterMeisterに感謝)

culture.CompareInfo.IndexOf(paragraph, Word, CompareOptions.IgnoreCase) >= 0

ここでcultureCultureInfo のインスタンスで、テキストが書かれている言語を記述しています。

このソリューションは、大文字と小文字を区別しない定義、つまり言語に依存するものについては透過的です。たとえば、英語では9番目の文字の大文字と小文字のバージョンにIおよびiの文字を使用しますが、トルコ語では 29文字のアルファベットの11番目と12番目の文字 にこれらの文字を使用します。 「i」のトルコ語の大文字バージョンは、なじみのない文字「İ」です。

したがって、文字列tinTINは同じWord英語ですが、異なる単語トルコ語です。私が理解するように、1つは「精神」を意味し、もう1つは擬音語です。 (トルコ、間違っている場合は修正してください、またはより良い例を提案してください)

要約すると、「これらの2つの文字列は同じですが、異なる場合に」という質問にのみ答えることができますテキストの言語がわかっている場合。わからない場合は、パントを取る必要があります。ソフトウェアの英語の覇権を考えると、おそらくおなじみの方法で間違っているので、 CultureInfo.InvariantCulture に頼るべきです。

1283
Colonel Panic

String.IndexOfメソッド を使用して、 StringComparison.OrdinalIgnoreCase を使用する検索タイプとして使用できます。

string title = "STRING";
bool contains = title.IndexOf("string", StringComparison.OrdinalIgnoreCase) >= 0;

さらに良いのは、stringの新しい拡張メソッドを定義することです。

public static class StringExtensions
{
    public static bool Contains(this string source, string toCheck, StringComparison comp)
    {
        return source?.IndexOf(toCheck, comp) >= 0;
    }
}

null伝播?.はC#6.0(VS 2015)以降で利用可能です。古いバージョンでは

if (source == null) return false;
return source.IndexOf(toCheck, comp) >= 0;

使用法: 

string title = "STRING";
bool contains = title.Contains("string", StringComparison.OrdinalIgnoreCase);
2486
JaredPar

このようにIndexOf()を使うことができます:

string title = "STRING";

if (title.IndexOf("string", 0, StringComparison.CurrentCultureIgnoreCase) != -1)
{
    // The string exists in the original
}

0(ゼロ)はインデックスになることがあるので、-1に対してチェックします。

_ msdn _

その文字列が見つかった場合はvalueの0から始まるインデックス位置、見つからなかった場合は-1 valueがString.Emptyの場合、戻り値は0です。

212
mkchandler

正規表現を使用した代替ソリューション:

bool contains = Regex.IsMatch("StRiNG to search", Regex.Escape("string"), RegexOptions.IgnoreCase);
121
Jed

あなたはいつも最初に単に文字列を大文字または小文字に変換することができます。 

string title = "string":
title.ToUpper().Contains("STRING")  // returns true

おっと、その最後のビットを見たばかりです。大文字と小文字を区別しない比較でも、*probably*は同じように動作します。パフォーマンスが問題にならない場合は、大文字のコピーを作成してそれらを比較することに問題はありません。私は一度大文字と小文字を区別しない比較を一度見たことを誓うことができました...

70
Ed S.

答えの1つの問題は、文字列がnullの場合に例外が発生することです。そうではないので、あなたはそれをチェックとして追加することができます。

public static bool Contains(this string source, string toCheck, StringComparison comp)
{
    if (string.IsNullOrEmpty(toCheck) || string.IsNullOrEmpty(source))
        return true;

    return source.IndexOf(toCheck, comp) >= 0;
} 
48
FeiBao 飞豹

StringExtensionクラスは今後の道です、私は完全なコード例を与えるために上記の記事のいくつかを結合しました:

public static class StringExtensions
{
    /// <summary>
    /// Allows case insensitive checks
    /// </summary>
    public static bool Contains(this string source, string toCheck, StringComparison comp)
    {
        return source.IndexOf(toCheck, comp) >= 0;
    }
}
34
Andrew

これは清潔で簡単です。

Regex.IsMatch(file, fileNamestr, RegexOptions.IgnoreCase)
34
takirala

OrdinalIgnoreCase、CurrentCultureIgnoreCase、またはInvariantCultureIgnoreCaseのいずれか

これが欠けているので、ここでどちらを使うべきかについてのいくつかの推奨があります:

ドス

  • カルチャにとらわれない文字列マッチングのための安全なデフォルトとして、比較のためにStringComparison.OrdinalIgnoreCaseを使用してください。
  • 速度を上げるにはStringComparison.OrdinalIgnoreCase比較を使用してください。
  • 出力をユーザーに表示するときは、StringComparison.CurrentCulture-based文字列操作を使用してください。
  • 比較が次の場合に、非言語のStringComparison.OrdinalまたはStringComparison.OrdinalIgnoreCaseを使用するように、不変のカルチャに基づいて現在の文字列操作の使用を切り替えます
    言語的に無関係です(たとえば、記号)。 
  • 比較のために文字列を正規化するときは、ToUpperInvariantではなくToLowerInvariantを使用してください。

しない

  • 明示的にしない、または暗黙的に文字列比較メカニズムを指定しない文字列操作にはオーバーロードを使用します。
  • StringComparison.InvariantCultureベースの文字列を使用
    ほとんどの場合操作いくつかの例外の1つは
    言語的には意味があるが文化的に不可知論的なデータを永続化する。

これらの規則に基づいて、あなたは使うべきです:

string title = "STRING";
if (title.IndexOf("string", 0, StringComparison.[YourDecision]) != -1)
{
    // The string exists in the original
}

一方、[YourDecision]は上記の推奨事項によって異なります。

ソースのリンク: http://msdn.Microsoft.com/en-us/library/ms973919.aspx

24
Fabian Bigler

.NET Core 2.0以降のみ(現在)

.NET Coreには、バージョン2.0以降、これに対処するための一対のメソッドがありました。

  • String.Contains(Char、 StringComparison
  • String.Contains(String、 StringComparison

例:

"Test".Contains("test", System.StringComparison.CurrentCultureIgnoreCase);

やがて、彼らはおそらく.NET標準に入り、そこから、基本クラスライブラリの他のすべての実装に入ります。

12
Mathieu Renda

これらは最も簡単な解決策です。

  1. のインデックスで

    string title = "STRING";
    
    if (title.IndexOf("string", 0, StringComparison.CurrentCultureIgnoreCase) != -1)
    {
        // contains 
    }
    
  2. 大文字と小文字を変える

    string title = "STRING";
    
    bool contains = title.ToLower().Contains("string")
    
  3. 正規表現で

    Regex.IsMatch(title, "string", RegexOptions.IgnoreCase);
    
11
LAV VISHWAKARMA

ちょうどこのような:

string s="AbcdEf";
if(s.ToLower().Contains("def"))
{
    Console.WriteLine("yes");
}
10
cdytoby

国際化について懸念がある場合は、VisualBasicアセンブリのInStrメソッドが最善です(または再実装できます)。それを見ると、dotNeetPeekは大文字と小文字だけでなく、かなタイプと全角文字と半角文字(主にアジア言語に関連していますが、ローマ字の全角バージョンもあります)を示しています)詳細はスキップしますが、プライベートメソッドInternalInStrTextをチェックしてください。

private static int InternalInStrText(int lStartPos, string sSrc, string sFind)
{
  int num = sSrc == null ? 0 : sSrc.Length;
  if (lStartPos > num || num == 0)
    return -1;
  if (sFind == null || sFind.Length == 0)
    return lStartPos;
  else
    return Utils.GetCultureInfo().CompareInfo.IndexOf(sSrc, sFind, lStartPos, CompareOptions.IgnoreCase | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth);
}
10
Casey

これはC#ではないことを私は知っていますが、フレームワーク(VB.NET)にはすでにそのような関数があります。

Dim str As String = "UPPERlower"
Dim b As Boolean = InStr(str, "UpperLower")

C#の亜種:

string myString = "Hello World";
bool contains = Microsoft.VisualBasic.Strings.InStr(myString, "world");
10
serhio

これを使って:

string.Compare("string", "STRING", new System.Globalization.CultureInfo("en-US"), System.Globalization.CompareOptions.IgnoreCase);
9
mr.martan

これを行うには、RegExを使用するのが簡単です。

Regex.IsMatch(title, "string", RegexOptions.IgnoreCase);
6
Stend

これは他の例と非常に似ていますが、他の方法は通常必要ないので、enumをboolに単純化することにしました。これが私の例です:

public static class StringExtensions
{
    public static bool Contains(this string source, string toCheck, bool bCaseInsensitive )
    {
        return source.IndexOf(toCheck, bCaseInsensitive ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal) >= 0;
    }
}

使い方は次のようになります。

if( "main String substring".Contains("SUBSTRING", true) )
....
5
TarmoPikaro

ここでの秘訣は、大文字と小文字を区別せずに文字列を探すことですが、大文字と小文字を正確に同じにすることです。

 var s="Factory Reset";
 var txt="reset";
 int first = s.IndexOf(txt, StringComparison.InvariantCultureIgnoreCase) + txt.Length;
 var subString = s.Substring(first - txt.Length, txt.Length);

出力は「リセット」

2
Mr.B

string.indexof ()関数を使うことができます。大文字と小文字は区別されません

2
Okan SARICA
if ("strcmpstring1".IndexOf(Convert.ToString("strcmpstring2"), StringComparison.CurrentCultureIgnoreCase) >= 0){return true;}else{return false;}
2
Tamilselvan K
public static class StringExtension
{
    #region Public Methods

    public static bool ExContains(this string fullText, string value)
    {
        return ExIndexOf(fullText, value) > -1;
    }

    public static bool ExEquals(this string text, string textToCompare)
    {
        return text.Equals(textToCompare, StringComparison.OrdinalIgnoreCase);
    }

    public static bool ExHasAllEquals(this string text, params string[] textArgs)
    {
        for (int index = 0; index < textArgs.Length; index++)
            if (ExEquals(text, textArgs[index]) == false) return false;
        return true;
    }

    public static bool ExHasEquals(this string text, params string[] textArgs)
    {
        for (int index = 0; index < textArgs.Length; index++)
            if (ExEquals(text, textArgs[index])) return true;
        return false;
    }

    public static bool ExHasNoEquals(this string text, params string[] textArgs)
    {
        return ExHasEquals(text, textArgs) == false;
    }

    public static bool ExHasNotAllEquals(this string text, params string[] textArgs)
    {
        for (int index = 0; index < textArgs.Length; index++)
            if (ExEquals(text, textArgs[index])) return false;
        return true;
    }

    /// <summary>
    /// Reports the zero-based index of the first occurrence of the specified string
    /// in the current System.String object using StringComparison.InvariantCultureIgnoreCase.
    /// A parameter specifies the type of search to use for the specified string.
    /// </summary>
    /// <param name="fullText">
    /// The string to search inside.
    /// </param>
    /// <param name="value">
    /// The string to seek.
    /// </param>
    /// <returns>
    /// The index position of the value parameter if that string is found, or -1 if it
    /// is not. If value is System.String.Empty, the return value is 0.
    /// </returns>
    /// <exception cref="ArgumentNullException">
    /// fullText or value is null.
    /// </exception>
    public static int ExIndexOf(this string fullText, string value)
    {
        return fullText.IndexOf(value, StringComparison.OrdinalIgnoreCase);
    }

    public static bool ExNotEquals(this string text, string textToCompare)
    {
        return ExEquals(text, textToCompare) == false;
    }

    #endregion Public Methods
}
0
Final Heaven

渡された文字列が文字列であるかどうかを確認したい場合は、それに対する簡単な方法があります。

string yourStringForCheck= "abc";
string stringInWhichWeCheck= "Test abc abc";

bool isContaines = stringInWhichWeCheck.ToLower().IndexOf(yourStringForCheck.ToLower()) > -1;

This boolean value will return if string contains or not
0
shaishav shukla

ここでの答えを基にするために、文字列の拡張メソッドを作成して、これをユーザーにとってわかりやすくすることができます。

    public static bool ContainsIgnoreCase(this string paragraph, string Word)
    {
        return new CultureInfo("en-US").CompareInfo.IndexOf(paragraph, Word, CompareOptions.IgnoreCase) >= 0;
    }
0