ฉันกำลังมองหาregex
ลวดลายที่จะเข้าคู่กับตัวละครตัวที่สามสี่ ... ตัวละครแต่ละตัว ดูคำอธิบายด้านล่าง:
ตัวอย่างเช่นฉันมีสตริงต่อไปนี้:
111aabbccxccybbzaa1
ฉันต้องการแทนที่อักขระที่ซ้ำกันทั้งหมดหลังจากที่เกิดขึ้นครั้งที่สอง ผลลัพธ์จะเป็น:
11-aabbccx--y--z---
บางรูปแบบของ regex ที่ฉันลองมา:
ใช้ regex ต่อไปนี้ฉันสามารถค้นหาการเกิดขึ้นครั้งสุดท้ายของตัวละครแต่ละตัว: (.)(?=.*\1)
หรือใช้อันนี้ฉันสามารถทำได้เพื่อทำซ้ำติดต่อกัน แต่ไม่ใช่สำหรับการทำซ้ำ: ([a-zA-Z1-9])\1{2,}
(.)(?<=^(?:(?:(?!\1).)*\1){2,}(?:(?!\1).)*\1)
regex การสาธิต
(.)(?<=(.*\1){3})
เหรอ?
(.)(?<=(?:.*\1){3})
ก็จะทำงานเช่นกัน แต่สิ่งเหล่านี้ไม่ดีเนื่องจากการย้อนรอยมากเกินไปอาจทำให้เกิดปัญหากับสายอักขระที่ยาวกว่า ฉันอยากจะเขียนวิธีที่ไม่ใช่ regex เพื่อแก้ปัญหา
(.)(?<=(?:.*\1){3})
25ms, (.)(?<=(?:\1.*?){2}\1)
3ms คุณสามารถทดสอบด้วยตัวเอง คุณดูเหมือนจะเป็นรูปแบบที่มีประสิทธิภาพน้อยที่สุดและอ่านยากที่สุด