Вигляд заплутаної групи відповідей, частково тому, що назва питання насправді набагато більша, ніж конкретне запитання. Після прочитання я не впевнений, що будь-яка відповідь знаходиться на відстані кількох змін від засвоєння всіх хороших речей, тому я зрозумів, що спробую підбити підсумки.
Ось метод розширення, який, на мою думку, дозволяє уникнути згаданих тут підводних каменів і пропонує найбільш широко застосовне рішення.
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
не повинно бути.
Примітка. Однак ви повинні уникати $
нового значення, яке ви вставляєте, якщо вони є частиною того, що, здавалося б, є маркером "захопленого значення" . Таким чином, три знаки долара в Regex.Замініть всередині 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, відчувають, що їх використання уникає помилок, але я часто все ще частково баю нюхаючі рядки (але лише після того, як прочитав Спольського на кодуваннях ), щоб бути абсолютно впевненим, що ти отримуєш те, що ти призначені для важливих випадків використання. Трохи нагадує про Крокфорда про " небезпечні регулярні вирази ". Занадто часто ми пишемо регулярні вирази, які дозволяють нам те, що ми хочемо (якщо нам пощастило), але ненавмисно дозволяють отримати більше в (наприклад, чи $10
справді це дійсна строка "значення захоплення" в моєму newgealge regexp, вище?), Тому що ми не були достатньо продумані . Обидва методи мають цінність, і обидва заохочують різні типи ненавмисних помилок. Часто важко недооцінити складність.
Це дивне $
втеча (і що Regex.Escape
не уникнуло захоплених шаблонів значень, як, $0
як я б очікував, в замінних значеннях) змусило мене з розуму на деякий час. Програмування важке (с) 1842