2015-08-18 20 views
5

Regex.Replace sagt:Regex ersetzt nur übereinstimmende Gruppen und ignoriert nicht übereinstimmende Gruppen?

In einer Eingabezeichenfolge angegeben, alle Strings ersetzt, die einen angegebenen regulären Ausdruck mit einer bestimmten Ersatzzeichenfolge entsprechen.

In meinem Fall:

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

Ausgang:

0x010102_default_prg_L2_ 

aber ich erwartete

0x010102_default_prg_L2_E2_LLC 

Warum ist es meine nicht-passenden Gruppen (Gruppe 1 zu ersetzen und 3)? Und wie behebe ich das, um die erwartete Ausgabe zu bekommen?

Demo

Antwort

5

Drehen Sie die ersten und die letzten nicht-einfangenden Gruppen zu erfassen Gruppen, so dass Sie thoses Zeichen in dem Ersatzteil und entfernen Sie die unnötige zweite Erfassungsgruppe beziehen könnten.

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

oder

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

Dies funktioniert: pls Gruppenauswahl fixieren von "$ 1 $ 2" auf "$ 1 $ 3". Kannst du erklären, wie es funktioniert? Was wäre, wenn ich anstelle von Leerstring die Zeichenfolge "abc" ersetzen müsste? – greenfeet

+2

@greenfeet Warum muss ich '$ 1 $ 2' in' $ 1 $ 3' ändern, da ich die zweite Cap-Gruppe in Ihrer Regex entfernt habe. 2. Fügen Sie 'abc' zwischen' $ 1' und '$ 2' hinzu, dh' $ 1abc $ 2'. Für die zweite Antwort wäre nur "abc" statt "string.Empty" ausreichend. –

+2

Sie haben Recht, ich habe nicht bemerkt, dass Sie die zweite Gruppe entfernt haben, danke! – greenfeet

Verwandte Themen