2010-04-06 37 views
34

Đây là chuỗi đầu vào 23x * y34x2. Tôi muốn chèn " * " (ngôi sao được bao quanh bởi khoảng trắng) sau mỗi số theo sau là chữ cái và sau mỗi chữ cái theo sau là số. Vì vậy, chuỗi đầu vào của tôi sẽ trông như thế này: 23 * x * y * 34 * x * 2.Công cụ MatchEvaluator trong Regex.Replace hoạt động như thế nào?

Đây là regex thực hiện công việc: @"\d(?=[a-z])|[a-z](?=\d)". Đây là chức năng mà tôi đã viết mà chèn " * ".

Regex reg = new Regex(@"\d(?=[a-z])|[a-z](?=\d)"); 
MatchCollection matchC; 
matchC = reg.Matches(input); 
int ii = 1; 
foreach (Match element in matchC)//foreach match I will find the index of that match 
{ 
    input = input.Insert(element.Index + ii, " * ");//since I' am inserting " * " (3 characters) 
    ii += 3;          //I must increment index by 3 
} 
return input; //return modified input 

Câu hỏi của tôi về cách thực hiện công việc tương tự bằng cách sử dụng .net MatchEvaluator? Tôi mới để regex và không hiểu tốt thay thế bằng MatchEvaluator. Đây là mã mà tôi cố gắng viết:

Regex reg = new Regex(@"\d(?=[a-z])|[a-z](?=\d)"); 
    MatchEvaluator matchEval = new MatchEvaluator(ReplaceStar); 
    input = reg.Replace(input, matchEval); 
    return input; 
} 
public string ReplaceStar(Match match) 
{ 
    //return What?? 
} 

Trả lời

49

Một MatchEvaluator là một đại biểu mà phải mất một đối tượng Match và trả về một chuỗi mà nên được thay thế thay vì đấu. Bạn cũng có thể tham khảo các nhóm từ trận đấu. Bạn có thể viết lại mã của bạn như sau:

string input = "23x * y34x2"; 
Regex reg = new Regex(@"\d(?=[a-z])|[a-z](?=\d)"); 
string result = reg.Replace(input, delegate(Match m) { 
    return m.Value + " * "; 
}); 

Để đưa ra một ví dụ về cách làm việc này, lần đầu tiên các đại biểu được gọi, thông số trận đấu sẽ là một trận đấu trên chuỗi "3". Các đại biểu trong trường hợp này được xác định để trả lại trận đấu chính nó như là một chuỗi nối với " * ". Vì vậy, "3" đầu tiên được thay thế bằng "3 * ".

Quy trình tiếp tục theo cách này, với đại biểu được gọi một lần cho mỗi kết quả phù hợp trong chuỗi ban đầu.

+0

thx, tôi hiểu – dontoo

+2

Tôi muốn đề cập rằng kể từ khi thêm biểu thức lambda 'delegate (Match m) {return m.Value +" * "; } 'có thể được thay thế bằng' (Kết hợp m) => trả về m.Value + "*"; '. Yay tiến bộ. – Pharap

+8

^có thể được đơn giản hóa hơn nữa chỉ là '(m) => m.Value +" * "' – m1kael

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