Ich suche nach einem regex
Muster, das dem dritten, vierten, ... Vorkommen jedes Zeichens entspricht. Schauen Sie unten zur Verdeutlichung:
Zum Beispiel habe ich die folgende Zeichenfolge:
111aabbccxccybbzaa1
Ich möchte alle duplizierten Zeichen nach dem zweiten Vorkommen ersetzen. Die Ausgabe wird sein:
11-aabbccx--y--z---
Einige Regex-Muster, die ich bisher ausprobiert habe:
Mit dem folgenden regulären Ausdruck kann ich das letzte Vorkommen jedes Zeichens finden: (.)(?=.*\1)
Oder mit diesem kann ich es für aufeinanderfolgende Duplikate tun, aber nicht für irgendwelche Duplikate: ([a-zA-Z1-9])\1{2,}
(.)(?<=^(?:(?:(?!\1).)*\1){2,}(?:(?!\1).)*\1)
Regex. Demo .
(.)(?<=(.*\1){3})
?
(.)(?<=(?:.*\1){3})
ich werde den Job auch machen, aber all dies ist nicht gut, da übermäßiges Backtracking Probleme mit längeren Strings verursachen kann. Ich würde lieber eine Nicht-Regex-Methode schreiben, um das Problem zu lösen.
(.)(?<=(?:.*\1){3})
erhalte ich einen Leistungsunterschied, z. B. Ihr Muster 750ms, 25ms, (.)(?<=(?:\1.*?){2}\1)
3ms. Sie können sich einfach selbst testen. Ihr Muster scheint das am wenigsten effiziente zu sein, und es ist am schwersten zu lesen.