Есть ли способ сделать следующее возвращение верным?
string title = "ASTRINGTOTEST";
title.Contains("string");
Кажется, что нет перегрузки, которая позволяет мне устанавливать чувствительность к регистру. В настоящее время я ОБОСНОВАЛ их обоих, но это просто глупо (я имею в виду проблемы с i18n, которые идут с корпусом вверх и вниз).
ОБНОВЛЕНИЕ
Этот вопрос является древним, и с тех пор я понял, что попросил простой ответ для действительно обширной и сложной темы, если вы хотите исследовать его полностью.
В большинстве случаев, в одноязычных, английских кодовых базах этого ответа будет достаточно. Я подозреваю, потому что большинство людей, приходящих сюда, попадают в эту категорию, это самый популярный ответ.
Этот ответ, однако, поднимает внутреннюю проблему, заключающуюся в том, что мы не можем сравнивать текст без учета регистра, пока мы не знаем, что оба текста - это одна и та же культура, и мы не знаем, что это за культура. Возможно, это менее популярный ответ, но я думаю, что он более правильный, и поэтому я отметил его как таковой.
источник
culture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0
? Он использует правильную культуру и нечувствителен к регистру, он не выделяет временные строчные буквы, и он избегает вопроса о том, всегда ли преобразование в строчные буквы и сравнение всегда то же самое, что и сравнение без учета регистра.Вы можете использовать метод String.IndexOf и передать
StringComparison.OrdinalIgnoreCase
в качестве типа поиска:Еще лучше определить новый метод расширения для строки:
Обратите внимание, что нулевое распространение
?.
доступно начиная с C # 6.0 (VS 2015), для более старых версийПРИМЕНЕНИЕ:
источник
paragraph.ToLower(culture).Contains(word.ToLower(culture))
с,CultureInfo.InvariantCulture
и не решает никаких проблем локализации. Зачем усложнять вещи? stackoverflow.com/a/15464440/284795ToLower
версия включает в себя 2 выделения, которые не нужны в операции сравнения / поиска. Зачем ненужно выделять в сценарии, который не требует этого?string
что,IEnumerable<char>
следовательно, вы не можете использовать его для поиска подстрокstring.IndexOf(string)
используется текущая культура, а по умолчаниюstring.Contains(string)
используется порядковый компаратор. Как мы знаем, первое можно изменить, выбрав более длительную перегрузку, а второе нельзя изменить. Следствием этого несоответствия является следующий пример кода:Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; string self = "Waldstrasse"; string value = "straße"; Console.WriteLine(self.Contains(value));/* False */ Console.WriteLine(self.IndexOf(value) >= 0);/* True */
Вы можете использовать
IndexOf()
так:Поскольку 0 (ноль) может быть индексом, вы проверяете значение -1.
MSDN
источник
Альтернативное решение с использованием Regex:
источник
RegexOptions.IgnoreCase & RegexOptions.IgnorePatternWhitespace & RegexOptions.CultureInvariant;
для любого, если это поможет."."
в"This is a sample string that doesn't contain the search string"
. Или попробуйте поискать"(invalid"
, в этом отношении.Regex.Escape
может помочь. Регулярное выражение все еще кажется ненужным, когдаIndexOf
/ extensionContains
простое (и, возможно, более понятное).Вы всегда можете сначала поднять или опустить струны.
Ой, только что видел это последнее. Сравнение без учета регистра,
*
вероятно,*
сделало бы то же самое в любом случае, и если производительность не является проблемой, я не вижу проблемы с созданием копий в верхнем регистре и их сравнением. Я мог бы поклясться, что однажды видел сравнение без учета регистра ...источник
Только .NET Core 2.0+ (на данный момент)
.NET Core имеет пару методов для решения этой проблемы начиная с версии 2.0:
Пример:
Со временем они, вероятно, перейдут в стандарт .NET и оттуда во все другие реализации библиотеки базовых классов.
источник
Одна из проблем с ответом состоит в том, что он выдаст исключение, если строка имеет значение null. Вы можете добавить это как проверку, чтобы она не была:
источник
if (string.IsNullOrEmpty(source)) return string.IsNullOrEmpty(toCheck);
Класс StringExtension - это путь вперед, я объединил пару постов выше, чтобы дать полный пример кода:
источник
StringComparison
?Это чисто и просто.
источник
fileNamestr
есть какие - либо специальные символы регулярных выражений (например*
,+
,.
и т.д.) , то вы будете в течение довольно неожиданно. Единственный способ заставить это решение работать как правильнаяContains
функция - это уйтиfileNamestr
от делRegex.Escape(fileNamestr)
.OrdinalIgnoreCase, CurrentCultureIgnoreCase или InvariantCultureIgnoreCase?
Поскольку этого не хватает, вот несколько рекомендаций о том, когда использовать какой из них:
ДОС
StringComparison.OrdinalIgnoreCase
для сравнения в качестве безопасного значения по умолчанию для сопоставления строк, не зависящего от культуры.StringComparison.OrdinalIgnoreCase
сравнения для увеличения скорости.StringComparison.CurrentCulture-based
строковые операции при отображении вывода пользователю.StringComparison.Ordinal
илиStringComparison.OrdinalIgnoreCase
когда сравнение не имеетлингвистического значения (например, символическое).
ToUpperInvariant
вместоToLowerInvariant
нормализации строк для сравнения.Этикет
StringComparison.InvariantCulture
строковыеоперации на основе в большинстве случаев; одним из немногих исключений будет
сохранение лингвистически значимых, но культурно-независимых данных.
На основании этих правил вы должны использовать:
тогда как [YourDecision] зависит от рекомендаций сверху.
ссылка на источник: http://msdn.microsoft.com/en-us/library/ms973919.aspx
источник
Это самые простые решения.
По индексу
Изменяя дело
По регулярному выражению
источник
Я знаю, что это не C #, но в фреймворке (VB.NET) уже есть такая функция
C # вариант:
источник
InStr
Метод из VisualBasic сборки лучше всего, если у вас есть озабоченность по поводу интернационализации (или вы можете переопределить его). Если посмотреть на это, dotNeetPeek показывает, что он учитывает не только заглавные и строчные буквы, но также и символы типа кана и символы полной ширины и полуширины (в основном это актуально для азиатских языков, хотя существуют версии полной ширины и латинского алфавита). ). Я пропускаю некоторые детали, но проверь приватный методInternalInStrText
:источник
Именно так:
источник
Использовать этот:
источник
Contains
неCompare
.Contains
с помощьюIndexOf
. Так что этот подход одинаково полезен! Пример кода C # на этой странице использует string.Compare (). Выбор команды SharePoint это!Это очень похоже на другой пример здесь, но я решил упростить enum до bool, первичный, потому что другие альтернативы обычно не нужны. Вот мой пример:
И использование что-то вроде:
источник
Использование RegEx - прямой способ сделать это:
источник
Просто, чтобы развить ответ здесь, вы можете создать метод расширения строки, чтобы сделать его немного более удобным для пользователя:
источник
return CultureInfo.CurrentCulture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0;
вместо этого.если вы хотите проверить, находится ли переданная вами строка в строке, то для этого есть простой метод.
Это логическое значение вернется, если строка содержится или нет
источник
Как просто и работает
источник
источник
Вы можете использовать
string.indexof ()
функцию. Это будет без учета регистраисточник
Хитрость здесь в том, чтобы искать строку, игнорируя регистр, но сохранять ее точно такой же (с тем же регистром).
Выход «Сброс»
источник
источник
Простой способ для новичка:
источник