2015-08-18 24 views
5

Regex.Replace diyor ki:Regex yalnızca eşleşen grupları değiştirir ve eşleşmeyen grupları yoksayar mı?

Belirtilen giriş dizesi

, bir belirtilen yerini alan dizeyle bir belirtilen normal ifadeyle eşleşen tüm dizeleri yerini alır. Benim durumumda

:

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); 

Çıktı:

0x010102_default_prg_L2_ 

ama neden benim eşleşmeyen gruplar değiştiriliyor

0x010102_default_prg_L2_E2_LLC 

bekliyordum (grup 1 ve 3)? Ve beklenen çıktıyı elde etmek için bunu nasıl düzeltebilirim?

Demo

cevap

5
Eğer yedek parçası Thoses karakterleri bakın ve gereksiz ikinci yakalama grubunu yerinden oynatacak kadar yakalama gruplarını ilk ve son olmayan yakalama gruplarını çevirin

.

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

veya

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

Bu çalışır: lütfen "$ 1 $ 2" den "$ 1 $ 3" ​​den grup seçimini düzeltin. Nasıl çalıştığını açıklayabilir misin? Boş dize yerine "abc" dizesiyle değiştirmem gerekirse ne olur? – greenfeet

+2

@greenfeet Neden regex'inizdeki ikinci kapak grubunu kaldırdığımdan, $ 1 $ 2 'yi $ 1 $ 3' olarak değiştirmem gerekiyor. 2. '$ 1' ve '$ 2', yani $ 1abc $ 2' arasında 'abc' ekleyin. İkinci cevap için, sadece '' abc'' yerine 'string.Empty' yeterli olacaktır. –

+2

haklısın, ikinci grubu çıkardığınızı farketmedim, teşekkürler! – greenfeet