c# первое строке - Нечувствительный к регистру «Содержит (строка)»




12 Answers

Чтобы проверить, содержит ли строка строку строку (спасибо @QuarterMeister)

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

Где culture - это экземпляр CultureInfo описывающий язык, на котором написан текст.

Это решение является прозрачным в отношении определения нечувствительности к регистру, которая зависит от языка . Например, английский язык использует символы I и i для верхних и нижних регистров девятой буквы, тогда как турецкий язык использует эти символы для одиннадцатой и двенадцатой букв своего 29-буквенного алфавита. Турецкая версия «i» в верхнем регистре - это незнакомый персонаж «İ».

Таким образом, строки tin и TIN являются одним и тем же словом на английском языке , но разные слова на турецком языке . Насколько я понимаю, один означает «дух», а другой - слово звукоподражания. (Турки, пожалуйста, поправьте меня, если я ошибаюсь, или предложите лучший пример)

Подводя итог, вы можете ответить только на вопрос: «Эти две строки одинаковы, но в разных случаях», если вы знаете, на каком языке находится текст . Если вы не знаете, вам придется взять пунт. Учитывая гегемонию английского языка в программном обеспечении, вы должны, вероятно, прибегнуть к CultureInfo.InvariantCulture , потому что это будет неправильно по-знакомым.

вхождение учета

Есть ли способ сделать следующее возвращение истинным?

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

Кажется, что нет перегрузки, которая позволяет мне установить чувствительность к регистру. В настоящее время я ВЕРХНИЙ их обоих, но это просто глупо (я имею в виду проблемы i18n которые поставляются с корпусом вверх и вниз).

ОБНОВИТЬ
Этот вопрос древний, и с тех пор я понял, что попросил простой ответ на очень обширную и трудную тему, если вы хотите изучить ее полностью.
В большинстве случаев в моноязычных, английских кодовых базах this ответ будет достаточным. Я подозреваю, что большинство людей, приезжающих сюда, попадают в эту категорию, это самый популярный ответ.
This ответ порождает неотъемлемую проблему, по которой мы не можем сравнивать текстовый регистр без учета, пока мы не узнаем, что оба текста являются одной и той же культурой, и мы знаем, что это за культура. Это, возможно, менее популярный ответ, но я думаю, что это более правильно, и именно поэтому я отметил его как таковой.




Вы можете использовать IndexOf() следующим образом:

string title = "STRING";

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

Так как 0 (ноль) может быть индексом, вы проверяете -1.

MSDN

Значение индекса, основанного на нулевом значении, если эта строка найдена, или -1, если это не так. Если значением является String.Empty, возвращаемое значение равно 0.




Вначале вы всегда можете просто перевернуть строки.

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

Ой, просто увидел последний бит. Нечувствительное к регистру сравнение могло бы * вероятно, сделать то же самое в любом случае, и если производительность не является проблемой, я не вижу проблемы с созданием заглавных копий и их сравнением. Я мог бы поклясться, что когда-то видел случайный анализ ...




Класс 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;
    }
}



OrdinalIgnoreCase, CurrentCultureIgnoreCase или InvariantCultureIgnoreCase?

Поскольку этого не хватает, вот несколько рекомендаций о том, когда использовать тот, который:

ДОС

  • Используйте StringComparison.OrdinalIgnoreCase для сравнения в качестве безопасного по умолчанию для сопоставления с 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




Метод InStr из сборки VisualBasic является лучшим, если вы беспокоитесь о интернационализации (или вы можете переопределить его). Глядя на него, dotNeetPeek показывает, что он не только учитывает кепки и строчные буквы, но также и для типа kana и полных символов полуширины (в основном это относится к азиатским языкам, хотя также имеются полноразмерные версии латинского алфавита ). Я просматриваю некоторые детали, но проверяю частный метод 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);
}



Использовать этот:

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



Использование RegEx - это прямой способ сделать это:

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



Это самые простые решения.

  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

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



Вы можете использовать string.indexof () . Это будет нечувствительным к регистру




.NET Core 2.0+ только (на данный момент)

У .NET Core было несколько методов для решения этой проблемы с версии 2.0:

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

Пример:

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

Со временем они, вероятно, войдут в стандарт .NET и, оттуда, во все другие реализации библиотеки базового класса.




если вы хотите проверить, находится ли ваша строка в строке, тогда для этого существует простой метод.

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



Related