Вид сбивающей с толку группы ответов, отчасти потому, что название вопроса на самом деле намного больше, чем конкретный задаваемый вопрос. После прочтения, я не уверен, что какой-либо ответ будет в нескольких редакциях от усвоения всех хороших вещей здесь, поэтому я решил, что я попытаюсь подвести итог.
Вот метод расширения, который, я думаю, позволяет избежать ловушек, упомянутых здесь, и обеспечивает наиболее широкое применение.
public static string ReplaceCaseInsensitiveFind(this string str, string findMe,
string newValue)
{
return Regex.Replace(str,
Regex.Escape(findMe),
Regex.Replace(newValue, "\\$[0-9]+", @"$$$0"),
RegexOptions.IgnoreCase);
}
Итак ...
К сожалению, комментарий @ HA о том, что вам нужно Escape
, все три неверны . Начальное значение и newValue
не должно быть.
Примечание: Однако вы должны экранировать $
s в новом значении, которое вы вставляете , если они являются частью того, что представляется "захваченным значением" «маркер . Таким образом, три знака доллара в Regex.Replace внутри Regex.Replace [sic]. Без этого что-то подобное ломается ...
"This is HIS fork, hIs spoon, hissssssss knife.".ReplaceCaseInsensitiveFind("his", @"he$0r")
Вот ошибка:
An unhandled exception of type 'System.ArgumentException' occurred in System.dll
Additional information: parsing "The\hisr\ is\ he\HISr\ fork,\ he\hIsr\ spoon,\ he\hisrsssssss\ knife\." - Unrecognized escape sequence \h.
Скажите, что, я знаю, что люди, которым комфортно с Regex, чувствуют, что их использование позволяет избежать ошибок, но я часто все еще неравнодушен к байт-анализирующим строкам (но только после прочтения Spolsky о кодировках ) в быть абсолютно уверенным, что вы получаете то, что вы рассчитывали на важные варианты использования. Немного напоминает мне Крокфорда о « небезопасных регулярных выражениях ». Слишком часто мы пишем регулярные выражения, которые разрешают то, что мы хотим (если нам повезет), но непреднамеренно допускают больше в (например, действительно ли $10
является действительной строкой «значения захвата» в моем новом регулярном выражении newValue, выше?), Потому что мы не ' Я достаточно вдумчивый. Оба метода имеют ценность, и оба поощряют различные типы непреднамеренных ошибок. Часто легко недооценить сложность.
Этот странный $
выход (и то, что Regex.Escape
не избежал шаблонов с захваченными значениями, таких как $0
, как я и ожидал в значениях замены), на какое-то время сводил меня с ума. Программирование сложно (с) 1842