나는 regex
각 문자의 세 번째, 네 번째 ... 발생과 일치 하는 패턴을 찾고 있습니다. 설명을 위해 아래를보십시오.
예를 들어 다음 문자열이 있습니다.
111aabbccxccybbzaa1
두 번째 발생 후 모든 복제 된 문자를 바꾸고 싶습니다. 출력은 다음과 같습니다.
11-aabbccx--y--z---
내가 지금까지 시도한 일부 정규식 패턴 :
다음 정규식을 사용하여 각 문자의 마지막 항목을 찾을 수 있습니다. (.)(?=.*\1)
또는이 것을 사용하면 연속 복제에 대해서는 할 수 있지만 중복에 대해서는 할 수 없습니다. ([a-zA-Z1-9])\1{2,}
(.)(?<=^(?:(?:(?!\1).)*\1){2,}(?:(?!\1).)*\1)
정규식 과 함께 사용하십시오 . 데모 .
(.)(?<=(.*\1){3})
?
(.)(?<=(?:.*\1){3})
할 것이지만 과도한 역 추적은 긴 문자열에 문제를 일으킬 수 있기 때문에 이것들 모두는 좋지 않습니다. 오히려 문제를 해결하기 위해 정규식이 아닌 방법을 작성하고 싶습니다.
(.)(?<=(?:.*\1){3})
25ms, (.)(?<=(?:\1.*?){2}\1)
3ms 와 같은 성능 차이가 발생합니다 . 당신은 자신을 테스트 할 수 있습니다. 가장 효율적인 패턴으로 보이며 읽기가 가장 어렵습니다.