2009-05-19 14 views
6

Hãy xem xét ví dụ sau.Làm cách nào để thay thế một từ cụ thể trong C#?

string s = "The man is old. Them is not bad."; 

Nếu tôi sử dụng

s = s.Replace("The", "@@"); 

Sau đó, nó sẽ trả về "@@ man is old. @@m is not bad."
Nhưng tôi muốn đầu ra được "@@ man is old. Them is not bad."

Làm thế nào tôi có thể làm điều này?

+0

Tại sao tiêu đề chỉnh sửa để bao gồm Regex? Có nhiều cách để thay thế văn bản. Tôi thường cố gắng tránh Regex vì nó chậm vì vậy tôi không nghĩ rằng tiêu đề nên được chỉnh sửa để bao gồm câu trả lời "giả định". – Crispy

+1

@Chris Persichetti: Đủ công bằng; Tôi đã xóa "regex" khỏi tiêu đề. (Tôi đã thêm nó dựa trên các thẻ, nhưng "regex" dường như không phải là một trong các thẻ gốc.) –

Trả lời

23

Đây là cách bạn muốn sử dụng một regex, mà sẽ xử lý bất kỳ ranh giới từ:

Regex r = new Regex(@"\bThe\b"); 
s = r.Replace(s, "@@"); 
4

tôi đã thực hiện một lời nhận xét trên hỏi tại sao tiêu đề được thay đổi để đảm Regex là để được sử dụng.

Cá nhân tôi cố gắng không sử dụng Regex vì nó chậm. Regex là tuyệt vời cho các mẫu chuỗi phức tạp, nhưng nếu thay thế chuỗi là đơn giản và bạn cần một số hiệu suất ra khỏi nó, tôi sẽ cố gắng và tìm một cách mà không cần sử dụng Regex.

Đã cùng nhau thử nghiệm. Chạy một triệu thay thế bằng Regex và các phương thức chuỗi.

Regex mất 26.5 giây để hoàn tất, các phương thức chuỗi mất 8 giây để hoàn tất.

 //Using Regex. 
     Regex r = new Regex(@"\b[Tt]he\b"); 

     System.Diagnostics.Stopwatch stp = System.Diagnostics.Stopwatch.StartNew(); 

     for (int i = 0; i < 1000000; i++) 
     { 
      string str = "The man is old. The is the Good. Them is the bad."; 
      str = r.Replace(str, "@@"); 
     } 

     stp.Stop(); 
     Console.WriteLine(stp.Elapsed); 

     //Using String Methods. 
     stp = System.Diagnostics.Stopwatch.StartNew(); 

     for (int i = 0; i < 1000000; i++) 
     { 
      string str = "The man is old. The is the Good. Them is the bad."; 

      //Remove the The if the stirng starts with The. 
      if (str.StartsWith("The ")) 
      { 
       str = str.Remove(0, "The ".Length); 
       str = str.Insert(0, "@@ "); 
      } 

      //Remove references The and the. We can probably 
      //assume a sentence will not end in the. 
      str = str.Replace(" The ", " @@ "); 
      str = str.Replace(" the ", " @@ "); 
     } 

     stp.Stop(); 
     Console.WriteLine(stp.Elapsed); 
+2

Đối với dữ liệu đã cho, giải pháp tiết kiệm hơn của bạn hoạt động. Nhưng ngoài việc sử dụng regex (thừa nhận chậm), mã của bạn sẽ thất bại hoặc yêu cầu cập nhật nếu OP muốn sử dụng nó theo nghĩa tổng quát hơn, trong khi regex có thể được viết để tìm các ngắt từ sẽ xử lý dấu tách như dấu chấm câu đánh dấu thay vì chỉ có dấu cách. Xem nhận xét của tôi về bài đăng của @ auujay để biết chi tiết cụ thể. – JeffH

+1

Tôi biết đó không phải là giải pháp chung. Giải pháp Regex là một giải pháp tốt hơn cho an toàn cho các từ chung. Tôi đã cố gắng chỉ ra rằng regex không phải luôn luôn là giải pháp chỉ phụ thuộc vào những gì là cần thiết chính xác. Tôi cố gắng và xem các câu hỏi như thế này để tìm kiếm các mẹo để thay thế văn bản vì dự án của tôi thực hiện rất nhiều thay thế văn bản và tôi luôn tìm cách nhanh hơn để thực hiện. Vì vậy, tôi đã thất vọng khi tiêu đề đã được thay đổi để Regex bởi vì tôi không muốn một reguiton regex cho dự án của tôi, vì vậy đó là lý do tại sao tôi đăng câu trả lời này. – Crispy

+0

@Crispy, bạn không thể chỉ nhìn vào thời gian hoạt động, phần mềm không chỉ chạy nhanh, nếu bạn không bận tâm về Tính rõ ràng, khả năng quản lý bạn sẽ tạo ra phần mềm nhanh hơn nhưng rất rộng để giữ và phát triển. –

0

C# console Application

static void Main(string[] args) 

     { 
      Console.Write("Please input your comment: "); 
      string str = Console.ReadLine(); 
      string[] str2 = str.Split(' '); 
      replaceStringWithString(str2); 
      Console.ReadLine(); 
     } 
     public static void replaceStringWithString(string[] word) 
     { 
      string[] strArry1 = new string[] { "good", "bad", "hate" }; 
      string[] strArry2 = new string[] { "g**d", "b*d", "h**e" }; 
      for (int j = 0; j < strArry1.Count(); j++) 
      { 
       for (int i = 0; i < word.Count(); i++) 
       { 
        if (word[i] == strArry1[j]) 
        { 
         word[i] = strArry2[j]; 
        } 
        Console.Write(word[i] + " "); 
       } 
      } 
     } 
Các vấn đề liên quan