Załóżmy, że mam następujące wyrażenie regularne:
-(\d+)-
i chcę, aby zastąpić, przy użyciu C #, Grupę 1 (\d+)
z AA
, aby uzyskać:
-AA-
Teraz zastępuję go za pomocą:
var text = "example-123-example";
var pattern = @"-(\d+)-";
var replaced = Regex.Replace(text, pattern, "-AA-");
Ale tak naprawdę nie podoba mi się to, ponieważ jeśli _(\d+)_
zamiast tego zmienię wzór, aby dopasować , będę musiał również zmienić ciąg zastępujący _AA_
, co jest sprzeczne z zasadą DRY.
Szukam czegoś takiego:
Zachowaj dopasowany tekst dokładnie tak, jak jest, ale zmień Grupę 1 według this text
i Grupę 2 według another text
...
Edycja:
To był tylko przykład. Po prostu szukam ogólnego sposobu robienia tego, co powiedziałem powyżej.
Powinien działać dla:
anything(\d+)more_text
i każdy wzór, jaki możesz sobie wyobrazić.
Wszystko, co chcę zrobić, to zastąpić tylko grupy i zachować resztę meczu.
:)
. Moim zdaniem to rozwiązanie jest znacznie lepsze i czystsze niż korzystanie z funkcji lookahead i lookbehinds..Value
dom.Groups[1]
itp.(?:foo)(bar)
,$1
zastąpibar
. więcej szczegółówMożesz to zrobić za pomocą lookahead i lookbehind :
źródło
Potrzebowałem tego i stworzyłem dla niego następującą metodę rozszerzenia:
Stosowanie:
Wynik:
źródło
Jeśli nie chcesz zmieniać wzorca, możesz użyć właściwości Indeks grupy i Długość dopasowanej grupy.
źródło
Oto kolejna fajna czysta opcja, która nie wymaga zmiany wzoru.
źródło
wykonaj poniższe kodowanie, aby uzyskać oddzielną grupę zastępczą.
źródło
Oto wersja podobna do Daniela, ale zastępująca wiele dopasowań:
źródło