Без учета регистра 'Содержит (строка)' - PullRequest
2671 голосов
/ 15 января 2009

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

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

Кажется, что нет перегрузки, которая позволяла бы мне устанавливать чувствительность к регистру. В настоящее время я ОБОСНОВЛЯЮ их обоих, но это просто глупо (под этим я имею в виду проблемы i18n , которые приходят с кожухом вверх и вниз).

UPDATE
Этот вопрос древний, и с тех пор я понял, что попросил простой ответ на действительно обширную и сложную тему, если вы хотите полностью его изучить.
В большинстве случаев в одноязычных, английских кодовых базах этого ответа будет достаточно. Я подозреваю, потому что большинство людей, приходящих сюда, попадают в эту категорию, это самый популярный ответ.
Этот ответ, однако, поднимает внутреннюю проблему, заключающуюся в том, что мы не можем сравнивать текст без учета регистра, пока мы не знаем, что оба текста - это одна и та же культура, и мы не знаем, что это за культура. Возможно, это менее популярный ответ, но я думаю, что он более правильный, и именно поэтому я отметил его как таковой.

Ответы [ 24 ]

12 голосов
/ 12 июля 2018

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

  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);
    
10 голосов
/ 13 июля 2014

Так же, как это:

string s="AbcdEf";
if(s.ToLower().Contains("def"))
{
    Console.WriteLine("yes");
}
10 голосов
/ 06 декабря 2013

Метод 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);
}
10 голосов
/ 09 сентября 2011

Я знаю, что это не 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");
9 голосов
/ 11 июля 2011

Используйте это:

string.Compare("string", "STRING", new System.Globalization.CultureInfo("en-US"), System.Globalization.CompareOptions.IgnoreCase);
6 голосов
/ 18 сентября 2013

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

Regex.IsMatch(title, "string", RegexOptions.IgnoreCase);
5 голосов
/ 17 октября 2015

Это очень похоже на другой пример здесь, но я решил упростить 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) )
....
2 голосов
/ 11 декабря 2016

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

2 голосов
/ 26 октября 2016
if ("strcmpstring1".IndexOf(Convert.ToString("strcmpstring2"), StringComparison.CurrentCultureIgnoreCase) >= 0){return true;}else{return false;}
2 голосов
/ 03 мая 2016

Хитрость здесь в том, чтобы искать строку, игнорируя регистр, но сохранять ее точно такой же (в том же регистре).

 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);

Выход «Сброс»

...