2010-12-30 15 views
5

Próbuję zastąpić pojedynczego (ostatniego lub następnego do ostatniego) dopasowania w ciągu znaków. Mam już moją Wyrażenie regularne i działa, ale zastępuje WSZYSTKIE elementy, a następnie muszę pobiec i zastąpić pojedynczy przedmiot.W jaki sposób używasz Wyrażeń regularnych do zamiany określonego dopasowania (np. "Ostatni" lub "drugi do ostatniego")?

 
Regex.Replace(BaseString, MatchString, ReplacementString) 

Chcę użyć MatchEvaluator, ale nie mogę dowiedzieć się, jak.

Każda pomoc?

+0

W zależności od zastosowania powinieneś rozważyć utworzenie instancji 'Regex'. – SLaks

Odpowiedz

13

MatchEvaluator jest po prostu delegat. Przekazujesz swoją funkcję.

W twoim przypadku należy użyć coś takiego:

 
Regex.Replace(BaseString, MatchString, delegate(Match match) 
        { 
         bool last = match.NextMatch().Index == 0; 

         if (last) 
          return match.Value; 
         else 
          return ReplacementString; 
        }, RegexOptions.Compiled); 

Kod ten pomija ostatni mecz. W podobny sposób można również sprawdzić dopasowanie od początku do końca.

zobaczyć również na to pytanie, aby uzyskać więcej informacji na temat korzystania z MatchEvaluator: How does MatchEvaluator in Regex.Replace work?

0

znalezisko w pętli zapisać ostatnią pozycję dopasowania, a następnie zastąpić

+0

Dzięki, ale szukam opcji nie dla każdej, chcę to zrobić w bardziej elegancki sposób. Twoja metoda zdecydowanie by działała. – jeffreypriebe

+0

wierzę, że regex po prostu nie został zaprojektowany do pętli –

4

Jest to zastąpić ostatni występowaniu gazów w ciągu:

String testString = "It is a very good day isn't it or is it.Tell me?"; 
Console.WriteLine(Regex.Replace(testString, 
        "(.*)(it)(.*)$", 
        "$1THAT$3", 
        RegexOptions.IgnoreCase)); 

Jeśli można podać, gdy przedostatni powinny być zastąpiony, mogę edytować odpowiedź, aby to uwzględnić.

+0

Nie jestem pewien co masz na myśli. Następny przedostatni powinien być mecz od drugiego do ostatniego. Jeśli masz ciąg strunów siana: "Próbujesz znaleźć konkretny ciąg znaków". - wtedy "następny do ostatniego" będzie "i" w "szczególności". – jeffreypriebe

+0

Zrozumiałem, co jest obok ostatniego, ale zdezorientowany, gdy mówisz ostatni lub następny do końca, należy zastąpić. Czy chcesz powiedzieć, że ostatnie dwa wystąpienia powinny zostać zastąpione? – Chandu

+0

Wystarczająco fair. Nie, w "przy końcu" chciałem, aby ta ostatnia została zastąpiona, ale nie ostatnia. Tak więc w powyższym łańcuchu Haystrick: "i" w "szczególności" _ ale nie_ "i" w "łańcuchu znaków". – jeffreypriebe

Powiązane problemy