2011-07-17 45 views
15

Làm cách nào để xóa ký tự lặp lại, ví dụ: thư k trong cakkkke cho nó là cake bằng cách sử dụng regex?Xóa ký tự lặp lại

+2

bạn mong chờ điều gì ở các từ như 'nhìn, miễn phí, cây'? –

+0

@Lawrence Cherone: tôi chỉ muốn thay thế nếu ký tự xuất hiện nhiều hơn n số lần. Tôi thường sẽ đặt giá trị n là 4 hoặc cao hơn –

+0

sau đó 'cakkkke' sẽ vượt qua –

Trả lời

33

Sử dụng backrefrences

echo preg_replace("/(.)\\1+/", "$1", "cakkke"); 

Output:

cake 

Giải thích:

(.) chụp bất kỳ ký tự nào

\\1 là một backreferences cho nhóm chụp đầu tiên. Các . ở trên trong trường hợp này.

+ làm cho trận đấu backreference ít nhất 1 (để nó phù hợp với aa, aaa, aaaa, nhưng không phải là một)

Thay thế nó với $1 thay thế văn bản phù hợp hoàn kkk trong trường hợp này, với nhóm chụp đầu tiên, k trong trường hợp này.

+0

tốt đẹp nó hoạt động, bạn có thể giúp đỡ thêm bằng cách giải thích regex. Tôi không hiểu làm thế nào nó hoạt động: các dấu gạch chéo? 1? +? –

+0

@Imran, kiểm tra câu trả lời cập nhật của tôi. Nếu bất cứ điều gì vẫn chưa rõ ràng, hãy hỏi. – Dogbert

+0

Thông tin thêm về tham chiếu trở lại: http://www.explainth.at/en/re/backref.shtml – Dogbert

0

Sử dụng regex này "(.)\\1+" và thay thế bằng $1.

Đừng thực sự biết php, nhưng trong C#:

Console.WriteLine(Regex.Replace("cakkkkeee", "(.)\\1+", "$1")); 
+0

Câu trả lời này bằng cách nào đó không liên quan đến ** câu hỏi cụ thể này **. Mặc dù mẫu có thể áp dụng. –

1

Bạn muốn khớp một ký tự đầu tiên, theo sau là ký tự đó được lặp lại: (.)\1+. Thay thế bằng ký tự đầu tiên. Các brackets tạo ra một backreference nhân vật đầu tiên, mà bạn sử dụng cả hai để phù hợp với các trường hợp lặp đi lặp lại và như là văn bản thay thế.

preg_replace('/(.)\1+/', '$1', $str); 
Các vấn đề liên quan