Kind của một nhóm khó hiểu của câu trả lời, một phần vì tiêu đề của câu hỏi thực sự là nhiều lớn hơn so với câu hỏi cụ thể được yêu cầu. Sau khi đọc qua, tôi không chắc chắn bất kỳ câu trả lời là một vài chỉnh sửa đi từ đồng hóa tất cả những thứ tốt ở đây, vì vậy tôi figured tôi muốn cố gắng để tổng hợp.
Dưới đây là một phương pháp tiện ích mở rộng mà tôi cho rằng tránh các cạm bẫy được đề cập ở đây và cung cấp giải pháp áp dụng rộng rãi nhất.
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);
}
Vậy ...
Thật không may, @HA 's comment that you have to Escape
all three isn't correct. Giá trị ban đầu và newValue
không cần thiết.
Lưu ý: Bạn làm, tuy nhiên, phải thoát khỏi $
s trong giá trị mới mà bạn đang chèn nếu chúng là một phần của những gì sẽ xuất hiện như một "giá trị bắt" đánh dấu. Vì vậy, ba dấu đô la trong Regex.Replace bên trong Regex.Replace [sic]. Nếu không có điều đó, một cái gì đó như thế này phá vỡ ...
"This is HIS fork, hIs spoon, hissssssss knife.".ReplaceCaseInsensitiveFind("his", @"he$0r")
Dưới đây là các lỗi:
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.
Giới thiệu với bạn những gì, tôi biết folks rằng cảm thấy thoải mái với Regex có cảm giác như họ sử dụng tránh được sai sót, nhưng Tôi thường vẫn còn một phần để chuỗi sniffing byte (nhưng chỉ sau khi đã đọc Spolsky on encodings) để được hoàn toàn chắc chắn bạn đang nhận được những gì bạn dự định cho các trường hợp sử dụng quan trọng. Nhắc tôi về Crockford trên "insecure regular expressions" một chút. Thông thường chúng tôi viết regexps cho phép những gì chúng tôi muốn (nếu chúng tôi may mắn), nhưng vô tình cho phép nhiều hơn (ví dụ, là $10
thực sự là một chuỗi giá trị "bắt giữ" hợp lệ trong regexp mới của tôi, ở trên?) Bởi vì chúng tôi không chu đáo đủ. Cả hai phương pháp đều có giá trị và cả hai đều khuyến khích các loại lỗi không chủ ý khác nhau. Nó thường dễ dàng đánh giá thấp sự phức tạp.
Điều lạ lùng $
thoát (và rằng Regex.Escape
không thoát khỏi các mẫu giá trị được ghi như $0
như tôi đã mong đợi trong các giá trị thay thế) đã khiến tôi phát điên trong một thời gian. Lập trình là cứng (c) 1842
Nếu "$ 0" là biến đi trong không ảnh hưởng đến regex. – cfeduke