2015-08-18 9 views
5

Regex.Replace mówi:Regex zastępuje tylko pasujące grupy i ignoruje niezgodne grupy?

w określonym ciągu wejściowego, zastępuje wszystkie ciągi, które pasują do podanego wyrażenia regularnego z określonym ciągiem zastępczym.

W moim przypadku:

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

wyjściowa:

0x010102_default_prg_L2_ 

ale spodziewałem

0x010102_default_prg_L2_E2_LLC 

Dlaczego jest zastąpienie moje niedopasowanych grup (grupa 1 i 3)? I jak to naprawić, aby uzyskać oczekiwany wynik?

Demo

Odpowiedz

5

Skręć w pierwszej i ostatniej grupy non-przechwytywania do przechwytywania grupy tak, że można odnieść thoses znaków w części zamienne i usunąć niepotrzebne drugą grupę przechwytywania.

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

lub

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

to działa: pls naprawić wyboru grupy z "$ 1 $ 2" na "$ 1 $ 3". Czy możesz wyjaśnić, jak to działa? Co się stanie, jeśli będę musiał zastąpić ciągiem "abc" zamiast pustego ciągu znaków? – greenfeet

+2

@ green-size, dlaczego muszę zmienić '$ 1 $ 2' na' $ 1 $ 3', ponieważ usunąłem drugą grupę capów obecnych w twoim regex. 2. Po prostu dodaj 'abc' inbetween' $ 1' i '$ 2', tj.' $ 1abc $ 2'. Dla drugiej odpowiedzi wystarczy '' abc "' zamiast 'string.Empty'. –

+2

masz rację, nie zauważyłem, że usunąłeś drugą grupę, dzięki! – greenfeet

Powiązane problemy