Trochę mylące grupy odpowiedzi, częściowo dlatego, że tytuł pytanie jest faktycznie znacznie większy niż konkretne pytanie jest zadawane. Po przeczytaniu, nie jestem pewna, czy jakakolwiek odpowiedź to tylko kilka zmian od przyswojenia wszystkich dobrych rzeczy tutaj, więc pomyślałem, że spróbuję podsumować.
Oto metoda rozszerzenia, która pozwala uniknąć opisanych tu pułapek i zapewnia najbardziej odpowiednie rozwiązanie.
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);
}
Więc ...
Niestety, @HA 's comment that you have to Escape
all three isn't correct. Wartość początkowa i newValue
nie musi być.
Uwaga: to zrobić, muszą jednak uciec $
S w nowej wartości, że jesteś wstawianie jeśli są częścią tego, co wydaje się być „złapany wartość” marker. Tak więc trzy znaki dolara w Regex.Replace wewnątrz Regex.Replace [sic]. Bez tego coś takiego łamie ...
"This is HIS fork, hIs spoon, hissssssss knife.".ReplaceCaseInsensitiveFind("his", @"he$0r")
Oto błąd:
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.
Wiesz co, wiem, że ludzie są wygodne z Regex ochoty ich stosowanie pozwala uniknąć błędów, ale Często jestem nadal stronniczy od tego, że bajtowe sygnały sniffujące (ale dopiero po przeczytaniu Spolsky on encodings) są absolutnie pewne, że otrzymujesz to, co zamierzałeś dla ważnych przypadków użycia. Przypomina mi trochę Crockforda o "insecure regular expressions". Zbyt często piszemy wyrażenia regularne, które pozwalają na to, co chcemy (jeśli mamy szczęście), ale nieumyślnie dopuszczamy więcej w (np. Czy $10
naprawdę jest prawidłowym ciągiem "wartości przechwytywania" w moim nowym wyrażeniu regularnym, powyżej?), Ponieważ nie byliśmy przemyślani dość. Obie metody mają wartość i oba zachęcają do różnych rodzajów niezamierzonych błędów. Często trudno jest nie docenić złożoności.
To dziwne $
uciekającego (i Regex.Escape
nie uciec uchwycone wzorców wartości jak $0
jak by się było spodziewać w wartościach zamiennych) zawiózł mnie do szału przez chwilę. Programowanie jest trudne (c) 1842
Jeśli „$ 0” jest zmienna będzie w to nie ma wpływu na wyrażenie regularne. – cfeduke