it-swarm.com.ru

Без учета регистра 'Содержит (строка)'

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

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

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

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

2579
Boris Callens

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

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

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

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

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

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

1202
Colonel Panic

Вы можете использовать метод String.IndexOf и передать StringComparison.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;
    }
}

Обратите внимание, что нулевое распространение?. доступно начиная с 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

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

212
mkchandler

Альтернативное решение с использованием Regex:

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

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

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

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

70
Ed S.

Одна из проблем с ответом заключается в том, что он выдаст исключение, если строка имеет значение 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
    операции в большинстве случаев; одним из немногих исключений будет
    сохраняющиеся лингвистически значимые, но культурно-независимые данные.

На основании этих правил вы должны использовать:

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, Сравнение строк )
  • String.Contains (Строка, Сравнение строк )

Пример:

"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

Метод InStr из VisualBasic Assembly лучше всего подходит, если у вас есть проблемы с интернационализацией (или вы можете переопределить ее). Если посмотреть на это, 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
Melbourne Developer