У меня есть строка под названием "Привет, мир"
Мне нужно заменить слово «мир» на «csharp»
для этого я использую:
string.Replace("World", "csharp");
но в результате я не получаю замену строки. Причина в чувствительности к регистру. Исходная строка содержит «мир», а я пытаюсь заменить «мир».
Есть ли способ избежать этой чувствительности к регистру в методе string.Replace?
Ответы:
Вы можете использовать Regex и выполнить замену без учета регистра:
источник
hello. world?
или что-либо еще, содержащее операторы регулярных выражений.Regex.Escape полезно , если вы полагаетесь на пользовательский ввод , который может содержит элементы языка Regex
Обновить
Благодаря комментариям вам на самом деле не нужно экранировать строку замены.
Вот небольшая скрипка, которая проверяет код :
Его вывод:
источник
Regex.Escape
это плохо, это будет префикс специальных символов с обратной косой чертой. Похоже, что лучший способ - это .Replace ("$", "$$"), что довольно глупо ( stackoverflow.com/a/10078353 ).2.5X БЫСТРЫЙ и НАИБОЛЕЕ ЭФФЕКТИВНЫЙ метод, чем другие методы регулярных выражений:
Примечание: игнорируйте регистр == в
StringComparison.OrdinalIgnoreCase
качестве параметра дляStringComparison comparisonType
. Это самый быстрый способ учета всех значений без учета регистра.Преимущества этого метода:
newValue
наnull
), оптимизировано для этого;string.Replace
, те же исключения;Эталонный тест : это решение в 2,59 раза быстрее, чем регулярное выражение из @Steve B., код:
Оригинальная идея - @ Darky711; спасибо @MinerR за
StringBuilder
.источник
String
. Тем не менее,StringBuilder
это действительно быстрее на 30-40%, чемString
. Я обновил решение. Спасибо;)Расширения делают нашу жизнь проще:
источник
Много предложений с использованием Regex. Как насчет этого метода расширения без него:
источник
comparison
параметр должен быть использован вIndexOf
, вместоStringComparison.CurrentCultureIgnoreCase
if(old.Equals(@new, comparison)) return @new;
поскольку новая строка может отличаться в верхнем / нижнем регистре.Вы можете использовать пространство имен Microsoft.VisualBasic, чтобы найти эту вспомогательную функцию:
источник
( Отредактировано: не знал о проблеме «голой ссылки», извините за это)
Взято отсюда :
Кажется, вы не первый, кто жаловался на отсутствие строки без учета регистра. Замените.
источник
Изменил ответ @ Darky711, чтобы использовать переданный тип сравнения и сопоставить структуру, как можно точнее заменить имена и комментарии xml.
источник
Я написал метод расширения:
Я использую два дополнительных метода расширения для предыдущего метода расширения:
источник
IsNot
относится к расширениям слишком серьезно :).IsNot
Расширение ответа Петруччо с помощью
Regex.Escape
строки поиска и выход из подобранной группы, как предложено в ответе Стива Б. (и некоторые незначительные изменения на мой вкус):Который даст следующие ожидаемые результаты:
Однако, не выполняя экранирование, вы получите следующее, что не является ожидаемым поведением от a,
String.Replace
которое не зависит от регистра:источник
Разве это не работает: я не могу представить, чтобы что-то еще было намного быстрее или проще.
источник
Функция ниже должна удалить все совпадающие слова как (this) из набора строк. Равикант Сонаре.
источник
При использовании решения @Georgy Batalov у меня возникла проблема при использовании следующего примера
строка оригинал = "бла, DC = бле, DC = блих, DC = бло, DC = ком"; замененная строка = original.ReplaceIgnoreCase (", DC =", ".")
Ниже как я переписал его расширение
источник
ниже - альтернатива для замены строки, игнорируя регистр символов
источник
Вы также можете попробовать
Regex
класс.var regex = new Regex( "camel", RegexOptions.IgnoreCase ); var newSentence = regex.Replace( sentence, "horse" );
источник
Я предпочитаю это - "Hello World" .ToLower (). Replace ("world", "csharp");
источник