Szukam regex
wzoru, który będzie pasował do trzeciego, czwartego, ... wystąpienia każdej postaci. Spójrz na wyjaśnienia poniżej:
Na przykład mam następujący ciąg:
111aabbccxccybbzaa1
Chcę zastąpić wszystkie zduplikowane znaki po drugim wystąpieniu. Dane wyjściowe będą:
11-aabbccx--y--z---
Niektóre wzorce wyrażeń regularnych, które próbowałem do tej pory:
Korzystając z następującego wyrażenia regularnego, mogę znaleźć ostatnie wystąpienie każdej postaci: (.)(?=.*\1)
Lub korzystając z tego mogę zrobić to dla kolejnych duplikatów, ale nie dla żadnych duplikatów: ([a-zA-Z1-9])\1{2,}
(.)(?<=^(?:(?:(?!\1).)*\1){2,}(?:(?!\1).)*\1)
wyrażeniem regularnym. Demo .
(.)(?<=(.*\1){3})
?
(.)(?<=(?:.*\1){3})
również wykona zadanie, ale nie są one dobre, ponieważ nadmierne cofanie może powodować problemy z dłuższymi ciągami. Wolę napisać metodę niebędącą wyrażeniem regularnym, aby rozwiązać problem.
(.)(?<=(?:.*\1){3})
25ms, (.)(?<=(?:\1.*?){2}\1)
3ms. Możesz po prostu sprawdzić się. Twój wydaje się być najmniej wydajnym wzorcem i najtrudniej go odczytać.