次のように返す方法はありますか?
string title = "ASTRINGTOTEST";
title.Contains("string");
大文字と小文字の区別を設定することを可能にする過負荷があるように思われません。現在私は両方とも大文字にしますが、それはただ愚かなことです(それによって私はup-付属する i18n 問題を言及します)。そしてダウンケーシング)。
_ update _
この質問は古くからあります。それ以来、あなたがそれを十分に調査したいのであれば、私は本当に広大で難しい話題について簡単な答えを求めたことに気づきました。
ほとんどの場合、単言語の英語コードベースでは{ this answerで十分です。ここに来るほとんどの人がこのカテゴリに入るので、これは最も人気のある答えです。
This answerは、両方のテキストが同じ文化であり、その文化が何であるかを知るまで、大文字と小文字を区別しないでテキストを比較できないという固有の問題を引き起こします。これはあまり一般的ではない答えかもしれませんが、私はそれがより正しいと思うので、そのようにマークしました。
文字列paragraph
に文字列Word
が含まれているかどうかをテストするには(@QuarterMeisterに感謝)
culture.CompareInfo.IndexOf(paragraph, Word, CompareOptions.IgnoreCase) >= 0
ここでculture
は CultureInfo
のインスタンスで、テキストが書かれている言語を記述しています。
このソリューションは、大文字と小文字を区別しない定義、つまり言語に依存するものについては透過的です。たとえば、英語では9番目の文字の大文字と小文字のバージョンにI
およびi
の文字を使用しますが、トルコ語では 29文字のアルファベットの11番目と12番目の文字 にこれらの文字を使用します。 「i」のトルコ語の大文字バージョンは、なじみのない文字「İ」です。
したがって、文字列tin
とTIN
は同じWord英語ですが、異なる単語トルコ語です。私が理解するように、1つは「精神」を意味し、もう1つは擬音語です。 (トルコ、間違っている場合は修正してください、またはより良い例を提案してください)
要約すると、「これらの2つの文字列は同じですが、異なる場合に」という質問にのみ答えることができますテキストの言語がわかっている場合。わからない場合は、パントを取る必要があります。ソフトウェアの英語の覇権を考えると、おそらくおなじみの方法で間違っているので、 CultureInfo.InvariantCulture
に頼るべきです。
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);
このようにIndexOf()
を使うことができます:
string title = "STRING";
if (title.IndexOf("string", 0, StringComparison.CurrentCultureIgnoreCase) != -1)
{
// The string exists in the original
}
0(ゼロ)はインデックスになることがあるので、-1に対してチェックします。
その文字列が見つかった場合はvalueの0から始まるインデックス位置、見つからなかった場合は-1 valueがString.Emptyの場合、戻り値は0です。
正規表現を使用した代替ソリューション:
bool contains = Regex.IsMatch("StRiNG to search", Regex.Escape("string"), RegexOptions.IgnoreCase);
あなたはいつも最初に単に文字列を大文字または小文字に変換することができます。
string title = "string":
title.ToUpper().Contains("STRING") // returns true
おっと、その最後のビットを見たばかりです。大文字と小文字を区別しない比較でも、*
probably*
は同じように動作します。パフォーマンスが問題にならない場合は、大文字のコピーを作成してそれらを比較することに問題はありません。私は一度大文字と小文字を区別しない比較を一度見たことを誓うことができました...
答えの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;
}
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;
}
}
これは清潔で簡単です。
Regex.IsMatch(file, fileNamestr, RegexOptions.IgnoreCase)
OrdinalIgnoreCase、CurrentCultureIgnoreCase、またはInvariantCultureIgnoreCaseのいずれか
これが欠けているので、ここでどちらを使うべきかについてのいくつかの推奨があります:
StringComparison.OrdinalIgnoreCase
を使用してください。StringComparison.OrdinalIgnoreCase
比較を使用してください。StringComparison.CurrentCulture-based
文字列操作を使用してください。StringComparison.Ordinal
またはStringComparison.OrdinalIgnoreCase
を使用するように、不変のカルチャに基づいて現在の文字列操作の使用を切り替えますToUpperInvariant
ではなくToLowerInvariant
を使用してください。StringComparison.InvariantCulture
ベースの文字列を使用これらの規則に基づいて、あなたは使うべきです:
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
.NET Coreには、バージョン2.0以降、これに対処するための一対のメソッドがありました。
例:
"Test".Contains("test", System.StringComparison.CurrentCultureIgnoreCase);
やがて、彼らはおそらく.NET標準に入り、そこから、基本クラスライブラリの他のすべての実装に入ります。
これらは最も簡単な解決策です。
のインデックスで
string title = "STRING";
if (title.IndexOf("string", 0, StringComparison.CurrentCultureIgnoreCase) != -1)
{
// contains
}
大文字と小文字を変える
string title = "STRING";
bool contains = title.ToLower().Contains("string")
正規表現で
Regex.IsMatch(title, "string", RegexOptions.IgnoreCase);
ちょうどこのような:
string s="AbcdEf";
if(s.ToLower().Contains("def"))
{
Console.WriteLine("yes");
}
国際化について懸念がある場合は、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);
}
これは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");
これを使って:
string.Compare("string", "STRING", new System.Globalization.CultureInfo("en-US"), System.Globalization.CompareOptions.IgnoreCase);
これを行うには、RegExを使用するのが簡単です。
Regex.IsMatch(title, "string", RegexOptions.IgnoreCase);
これは他の例と非常に似ていますが、他の方法は通常必要ないので、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) )
....
ここでの秘訣は、大文字と小文字を区別せずに文字列を探すことですが、大文字と小文字を正確に同じにすることです。
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);
出力は「リセット」
string.indexof ()
関数を使うことができます。大文字と小文字は区別されません
if ("strcmpstring1".IndexOf(Convert.ToString("strcmpstring2"), StringComparison.CurrentCultureIgnoreCase) >= 0){return true;}else{return false;}
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
}
渡された文字列が文字列であるかどうかを確認したい場合は、それに対する簡単な方法があります。
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
ここでの答えを基にするために、文字列の拡張メソッドを作成して、これをユーザーにとってわかりやすくすることができます。
public static bool ContainsIgnoreCase(this string paragraph, string Word)
{
return new CultureInfo("en-US").CompareInfo.IndexOf(paragraph, Word, CompareOptions.IgnoreCase) >= 0;
}