2012-09-14 33 views
5

Điều tôi đang cố gắng đạt được là thay thế các số trong chuỗi bằng một giá trị mới được tính từ (match * int).Tìm và thay số bằng chuỗi với regex

Vì vậy, các chuỗi đầu vào trông giống như:

500g Flour 
14g Salt 
7g Dry yeast 
45ml Olive oil 
309ml Water 

Và kết quả sẽ giống như thế này:

1000g Flour 
28g Salt 
14g Dry yeast 
90ml Olive oil 
618 ml Water 

row["ingredients"] là một DataRow.

Đây là nơi tôi đang ở:

System.Text.RegularExpressions. 
     Regex.Replace(row["ingredients"].ToString(), 
         @"[^/d]", Delegate(Match match) { return match * 2; }, 
         RegexOptions.Multiline); 

Bất kỳ giải pháp được đánh giá rất nhiều.

+3

Có thể là một câu hỏi ngớ ngẩn, nhưng có lý do tại sao bạn không tăng gấp đôi muối cùng với các thành phần khác? – dash

+0

có nên thay đổi '500g Bột 14g' thành' 1000g Bột 28g Muối 'không? nếu không, tôi nghĩ tất cả các câu trả lời phải được xem xét. – hamed

+0

Typo, phải là 28g muối – James

Trả lời

4

Vấn đề đầu tiên là regex của bạn chỉ phù hợp với các ký tự không phải là chữ số.

Correction: Nó được sử dụng dấu gạch chéo thay vì một dấu chéo ngược, vì vậy nó phù hợp với bất cứ điều gì đó không phải là một dấu gạch chéo hoặc quảng cáo

Thay đổi regex của bạn để @"\b(\d+)"

Dưới đây là một ví dụ làm việc trên dotnetfiddle.net

using System; 
using System.Text.RegularExpressions; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var string1 = "500g Flour 14g Salt 7g Dry yeast 45ml Olive oil 309ml Water"; 

      var result = Regex.Replace(string1, @"\b(\d+)", Doubler, RegexOptions.Multiline); 

      Console.WriteLine(result); 

      Console.ReadKey(); 
     } 

     private static string Doubler(Match match) 
     { 
      return (Convert.ToInt32(match.Value)*2).ToString(); 
     } 
    } 
} 
+0

Tại sao lại là downvote? – CaffGeek

+0

Không phải bởi tôi, nhưng regex của bạn phù hợp với chuỗi chữ '/ w /', theo sau bởi một hoặc nhiều 'd'. –

+0

@TimPietzcker, lỗi đánh máy, những thứ phải có dấu gạch chéo ngược, cố định – CaffGeek

1

[^/d] có nghĩa là "bất kỳ ký tự nào ngoại trừ dấu gạch chéo hoặc chữ cái d".

Để khớp một số, hãy sử dụng \d+.

0

Giữ loại dữ liệu khác nhau vào datarow không phải là thực hành tốt. Trong mẫu của bạn: "500g Bột" - ở đây bạn có thành phầnValue, measureType, ingredientName. Tôi khuyên bạn nên tạo lớp dữ liệu nhỏ sẽ đại diện cho hàng này và tất cả các loại dữ liệu sẽ là thuộc tính của lớp này.
Lợi ích là không biết gì:
- Không cần phải thay thế với regex kỳ diệu
- Dễ dàng mở rộng và sửa đổi

Tất cả những gì bạn cần với regex là tạo ra phân tích cú pháp đúng đắn về hàng dữ liệu được cung cấp. Nhưng chắc chắn nó dễ dàng hơn sau đó thủ đoạn với thay thế.

0
void Main() 
{ 
    string ingredients = 
@"500g Flour 
0.5g Salt 
7g Dry yeast 
45ml Olive oil 
309ml Water"; 

    string pattern = @"(?:[0-9]+\.?[0-9]*|\.[0-9]+)"; 

    int multiple = 2; 

    Regex.Replace(ingredients, pattern, m => (Convert.ToDecimal(m.Value)*multiple).ToString()).Dump(); 
} 

Tôi đã làm điều này trong LINQPad vì vậy đừng lo lắng về Dump() chỉ để xuất kết quả. Và tôi đã thay đổi muối thành 0,5 để chỉ ra rằng nó hoạt động với các số nguyên không. Đó là mô hình tốt nhất mà tôi có thể đưa ra để đối sánh số nguyên và số thập phân (có hoặc không có số bất kỳ trước số thập phân) sao cho nó khớp với 17, 3.141592 hoặc .5

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