2013-04-20 44 views
21

Tôi khá mới sử dụng cụm từ thông dụng và dựa trên một số hướng dẫn tôi đã đọc, tôi không thể thực hiện bước này trong Regex.Replace được định dạng đúng.Cụm từ thông dụng thay thế trong C#

Đây là kịch bản tôi đang làm việc ... Khi tôi kéo dữ liệu của mình từ hộp danh sách, tôi muốn định dạng nó thành một định dạng như CSV và sau đó lưu tệp. Sử dụng tùy chọn Thay thế có phải là giải pháp lý tưởng cho trường hợp này không?

Trước ví dụ về định dạng biểu thức chính quy.

FirstName LastName Salary Position 
------------------------------------- 
John  Smith $100,000.00 M 

định dạng được đề xuất sau khi biểu hiện thường xuyên thay

John Smith,100000,M 

hiện ra tình trạng định dạng:

John,Smith,100000,M 

* Ghi chú - là có cách nào tôi có thể thay thế các dấu phẩy đầu tiên với một khoảng trắng?

Snippet của mã của tôi

using(var fs = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write)) 
{ 
    using(var sw = new StreamWriter(fs)) 
    { 
     foreach (string stw in listBox1.Items) 
     { 
      StringBuilder sb = new StringBuilder(); 
      sb.AppendLine(stw); 

      //Piecing the list back to the original format 
      sb_trim = Regex.Replace(stw, @"[$,]", ""); 
      sb_trim = Regex.Replace(sb_trim, @"[.][0-9]+", ""); 
      sb_trim = Regex.Replace(sb_trim, @"\s", ","); 
      sw.WriteLine(sb_trim); 
     } 
    } 
} 
+0

Với regex của bạn '44.66' sẽ được thay thế là' 44' – Anirudha

+0

Chỉ cần Re-sửa tuyên bố của tôi ... Tôi đang chuyển đổi 100.000.00 thành 100000.Tôi đang để lại xu trên phương trình này khi tôi viết lại định dạng csv. – Curtis

+0

Vui lòng thử không sử dụng nhiều phông chữ đậm - Tôi đã xóa tất cả và cũng đã sửa các lệnh Gọi không hoàn thành của bạn để mã trông ổn. –

Trả lời

30

Bạn có thể làm điều đó với hai thay thế của

//let stw be "John Smith $100,000.00 M" 

sb_trim = Regex.Replace(stw, @"\s+\$|\s+(?=\w+$)", ","); 
//sb_trim becomes "John Smith,100,000.00,M" 

sb_trim = Regex.Replace(sb_trim, @"(?<=\d),(?=\d)|[.]0+(?=,)", ""); 
//sb_trim becomes "John Smith,100000,M" 

sw.WriteLine(sb_trim); 
+0

Hoạt động, cảm ơn Anirudh! – Curtis

+0

Điều này thực sự làm rất nhiều công việc không cần thiết, và có lẽ không tuyệt vời cho hiệu suất. Nếu bạn định làm điều đó, ít nhất hãy đặt thời gian chờ. – Zenexer

+0

@Zenexer anh ấy muốn thay thế ',', '.000's' trong tiền lương .. – Anirudha

3

Thêm 2 dòng sau

var regex = new Regex(Regex.Escape(",")); 
sb_trim = regex.Replace(sb_trim, " ", 1); 

Nếu sb_trim = John, Smith, 100000, M mã ở trên sẽ trả về "John Smith, 100000, M"

14

Hãy thử điều này ::

sb_trim = Regex.Replace(stw, @"(\D+)\s+\$([\d,]+)\.\d+\s+(.)", 
    m => string.Format(
     "{0},{1},{2}", 
     m.Groups[1].Value, 
     m.Groups[2].Value.Replace(",", string.Empty), 
     m.Groups[3].Value)); 

Đây là khoảng như sạch một câu trả lời như bạn sẽ nhận được, ít nhất là với regexes.

  • (\D+): Nhóm chụp đầu tiên. Một hoặc nhiều ký tự không phải chữ số.
  • \s+\$: Một hoặc nhiều ký tự cách nhau, sau đó là ký hiệu đô la ($).
  • ([\d,]+): Nhóm chụp thứ hai. Một hoặc nhiều chữ số và/hoặc dấu phẩy.
  • \.\d+: Điểm thập phân, sau đó ít nhất một chữ số.
  • \s+: Một hoặc nhiều ký tự cách nhau.
  • (.): Nhóm chụp thứ ba. Bất kỳ ký tự không ngắt dòng nào.

Nhóm chụp thứ hai cần bổ sung thêm dấu phẩy. Bạn có thể làm điều này với một regex khác, nhưng nó thực sự không cần thiết và xấu cho hiệu suất. Đây là lý do tại sao chúng ta cần phải sử dụng một biểu thức lambda và định dạng chuỗi để mảnh với nhau thay thế. Nếu nó không được cho rằng, chúng ta chỉ có thể sử dụng như là sự thay thế, ở vị trí của biểu thức lambda:

"$1,$2,$3" 
+0

Cảm ơn, vâng tôi đã cố gắng nhóm các biểu thức chính quy của mình, tuy nhiên tôi dường như làm phức tạp kịch bản của mình hơn bất kỳ thứ gì, vì vậy tôi đã hoàn nguyên về các khái niệm cơ bản. Tôi sẽ cung cấp cho một shot là tốt. – Curtis

+0

Có lẽ một số cách để tránh các dấu phẩy trong nhóm, nhưng nó thoát khỏi tôi. Chắc chắn có những người ở đây quen thuộc hơn với các quy trình cụ thể của .NET, vì vậy có lẽ họ sẽ biết. – Zenexer

+0

Tôi đã thêm một phiên bản tốt hơn nhiều - giả sử nó hoạt động. Một đường thẳng. – Zenexer

Các vấn đề liên quan