3228

次の戻り値を true にする方法はありますか?

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

大文字と小文字の区別を設定できる過負荷はないようです。現在、私は両方を大文字にしていますが、それはばかげています (これは、上下のケーシングに伴うi18nの問題を指しています)。

アップデート

この質問は古くからあり、それ以来、完全に調査したい場合は、非常に広大で難しいトピックに対して簡単な回答を求めていることに気付きました.

ほとんどの場合、単一言語の英語コード ベースでは、この回答で十分です。ここに来るほとんどの人がこのカテゴリに分類されるため、これが最も人気のある回答だと思います。

ただし、この回答は、両方のテキストが同じ文化であり、その文化が何であるかを知るまで、大文字と小文字を区別しないテキストを比較できないという固有の問題を引き起こします。これはあまり一般的ではない回答かもしれませんが、より正しいと思うので、そのようにマークしました。

4

29 に答える 29

2942

String.IndexOfMethodStringComparison.OrdinalIgnoreCaseを使用して、使用する検索のタイプ​​として渡すことができます。

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

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

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);
于 2009-01-14T21:44:11.623 に答える
1536

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

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

テキストが書かれている言語を記述するcultureインスタンスはどこにありますか。CultureInfo

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

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

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

于 2013-03-17T18:22:11.727 に答える
252

IndexOf()次のように使用できます。

string title = "STRING";

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

0 (ゼロ) はインデックスになる可能性があるため、-1 に対してチェックします。

MSDN

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

于 2009-01-14T21:48:46.357 に答える
156

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

bool contains = Regex.IsMatch("StRiNG to search", Regex.Escape("string"), RegexOptions.IgnoreCase);
于 2010-07-28T17:18:28.480 に答える
138

.NET Core 2.0+ (.NET 5.0+ を含む)

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

  • String.Contains(Char, StringComparison )
  • String.Contains(String, StringComparison )

例:

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

これは現在、正式に .NET Standard 2.1 の一部であるため、このバージョンの標準 (またはそれ以降のバージョン) を実装する基本クラス ライブラリのすべての実装の一部です。

于 2018-10-13T09:26:54.980 に答える
96

最初に文字列を常に大文字または小文字にすることができます。

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

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

于 2009-01-14T21:42:37.273 に答える
53

答えの 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;
} 
于 2010-12-07T21:11:34.190 に答える
40

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;
    }
}
于 2010-11-18T16:48:07.710 に答える
35

これはクリーンでシンプルです。

Regex.IsMatch(file, fileNamestr, RegexOptions.IgnoreCase)
于 2012-11-09T04:25:31.363 に答える
32

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

于 2014-06-17T10:31:23.523 に答える
13

ちょうどこのような:

string s="AbcdEf";
if(s.ToLower().Contains("def"))
{
    Console.WriteLine("yes");
}
于 2014-07-13T09:54:28.820 に答える
11

これは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");
于 2011-09-09T13:23:12.973 に答える
11

InStr国際化に関心がある (または再実装できる) 場合は、VisualBasic アセンブリのメソッドが最適です。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);
}
于 2013-12-06T14:11:23.373 に答える
10

これを使って:

string.Compare("string", "STRING", new System.Globalization.CultureInfo("en-US"), System.Globalization.CompareOptions.IgnoreCase);
于 2011-07-11T07:53:22.780 に答える
7

これはここの他の例と非常によく似ていますが、他の代替手段は通常必要ないため、enum を bool, primary に単純化することにしました。これが私の例です:

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) )
....
于 2015-10-17T07:46:58.717 に答える
6

これを行うには、正規表現を使用するのが簡単な方法です。

Regex.IsMatch(title, "string", RegexOptions.IgnoreCase);
于 2013-09-18T13:08:27.210 に答える