2015-08-18 20 views
5

Regex.Replace nói:Regex chỉ thay thế các nhóm phù hợp và bỏ qua các nhóm không phù hợp?

Trong một chuỗi đầu vào quy định, thay thế tất cả các chuỗi phù hợp với một quy định biểu thức chính quy với một chuỗi thay thế quy định.

Trong trường hợp của tôi:

string w_name = "0x010102_default_prg_L2_E2_LDep1_LLC"; 
string regex_exp = @"(?:E\d)([\w\d_]+)(?:_LLC)"; 
w_name = Regex.Replace(w_name, regex_exp, string.Empty); 

Output:

0x010102_default_prg_L2_ 

nhưng tôi đã mong

0x010102_default_prg_L2_E2_LLC 

Tại sao nó thay thế nhóm phi phù hợp với tôi (nhóm 1 và 3)? Và làm cách nào để khắc phục điều này để có được kết quả mong đợi?

Demo

Trả lời

5

Xoay nhóm phi chụp đầu tiên và cuối cùng để chụp nhóm để bạn có thể tham khảo chars thoses ở phần thay thế và loại bỏ các nhóm chụp thứ hai không cần thiết.

string w_name = "0x010102_default_prg_L2_E2_LDep1_LLC"; 
string regex_exp = @"(E\d)[\w\d_]+(_LLC)"; 
w_name = Regex.Replace(w_name, regex_exp, "$1$2"); 

DEMO

hoặc

string regex_exp = @"(?<=E\d)[\w\d_]+(?=_LLC)"; 
w_name = Regex.Replace(w_name, regex_exp, string.Empty); 
+0

này hoạt động: xin sửa chữa lựa chọn nhóm từ "$ 1 $ 2" thành "$ 1 $ 3". Bạn có thể giải thích cách nó hoạt động? Điều gì sẽ xảy ra nếu tôi cần thay thế bằng chuỗi ký tự "abc" thay vì chuỗi rỗng? – greenfeet

+2

@ greenfeet lý do tại sao tôi cần thay đổi '$ 1 $ 2' thành' $ 1 $ 3', vì tôi đã xóa nhóm mũ thứ hai có trong regex của bạn. 2. Chỉ cần thêm 'abc' inbetween' $ 1' và '$ 2', tức là' $ 1abc $ 2'. Đối với câu trả lời thứ hai, chỉ cần '" abc "' thay vì 'string.Empty' là đủ. –

+2

bạn nói đúng, tôi không nhận thấy bạn đã xóa nhóm thứ hai, cảm ơn! – greenfeet

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