2016-12-25 18 views
5

Tôi cần thay thế lần xuất hiện cuối cùng của ít nhất gấp đôi dòng mới (\ n \ n) trong một chuỗi, vì vậy được \ n \ n hoặc \ n \ n \ n hoặc \ n \ n \ n \ n một vân vân (ít nhất 2 \ n) bởi "@@". Tôi nghĩ rằng nó phải là preg_replace. Tôi đã thử nhiều tùy chọn có trong câu trả lời ở đây trên stackoverflow, nhưng tất cả các tùy chọn này có một số trường hợp không bị bắt. Tôi đã thử trang regex101 để chuẩn bị biểu thức chính quy, nhưng tôi không mạnh về điều này, vì vậy tôi tìm thấy một số giải pháp trông giống như làm việc trên trang web (/((\\n){2,})+(?!.*((\\n){2,})+)/i), nhưng khi tôi đang thử nó trong mã của tôi, tôi không làm việc.Thay thế lần xuất hiện cuối cùng của ít nhất là dòng kép mới ( n n) bằng chuỗi PHP

Một số khác là ([\\n\\n])+(.[^\\n\\n])*$, nhưng điều này cũng đánh bắt cuối cùng nn

Chuỗi kiểm tra là:

lưu trữ \ nThe mạnh mẽ quad-core vi xử lý X5 Intel trong Transformer Book T101HA có nghĩa là bạn' sẽ không gặp vấn đề gì khi thực hiện mọi công việc hàng ngày của bạn, \ nvới tính năng đa nhiệm liền mạch cho phép bạn hoàn thành nhiều việc hơn trong thời gian ít hơn. Lưu trữ là thuận tiện linh hoạt, quá. Bên trong, có 128GB bộ nhớ flash siêu nhanh và dễ dàng mở rộng qua khe cắm thẻ micro SD. Bạn cũng nhận được dung lượng lưu trữ đám mây miễn phí không giới hạn của bạn trên ASUS WebStorage! \ N \ nColor | White/Gold \ n \ n \ n \ n \ n \ nCPU | Innn dsafdsfdfa \ n \ n \ n \ n \ n \ n \ n \ n dfnn

Vì vậy, kết quả nên là:

lưu trữ \ nThe mạnh mẽ quad-core vi xử lý Intel X5 trong Transformer Book T101HA nghĩa là bạn sẽ không có vấn đề breezing qua tất cả hàng ngày của bạn công việc, \ nvới tính năng đa nhiệm liền mạch cho phép bạn hoàn thành nhiều việc hơn trong thời gian ít hơn. Lưu trữ là thuận tiện linh hoạt, quá. Bên trong, có 128GB bộ nhớ flash siêu nhanh và dễ dàng mở rộng qua khe cắm thẻ micro SD. Bạn cũng có thể bạn không giới hạn lưu trữ đám mây miễn phí một năm trên ASUS WebStorage \ n \ nColor |! Trắng/vàng \ n \ n \ n \ n \ n \ nCPU | Innn dsafdsfdfa @@ dfnn

Can ai giúp đỡ với điều này và có lẽ ngoài ra giải thích logic của regex trả lời.

Cảm ơn rất nhiều.

+0

Lưu ý rằng bạn có thể làm điều này bằng cách sử dụng [tham lam] (http://www.regular-expressions.info/repeat.html#greedy) mà không có bất kỳ lookahead nào. Tìm kiếm ['/^.*\V\K\R{2,}/s'](https://www.regex101.com/r/zOmdJ5/1) và thay thế bằng' @@ '. '. *' Sẽ ăn cho đến khi '\ V' * không theo chiều dọc cuối cùng * được theo sau bởi hai hoặc nhiều dòng mới' \ R'. ['\ K' reset] (http://www.rexegg.com/regex-php.html#K) bắt đầu của trận đấu được báo cáo (bộ từ nơi bắt đầu thay thế). Xem [demo này tại eval.in] (https://eval.in/704280). –

Trả lời

5

Bạn có thể sử dụng

/\n{2,}(?!.*\n{2})/s 

Xem regex demo

Chi tiết:

  • \n{2,} - 2 hoặc nhiều dòng mới
  • (?!.*\n{2}) - không tiếp với bất kỳ 0+ chars sau với 2 dòng mới.

Nếu có bất kỳ dấu ngắt dòng nào, hãy thay thế \n bằng \R.

+0

Cảm ơn bạn rất nhiều, tôi đã thực hiện một số thay đổi khi tôi thấy rằng chuỗi của tôi đi kèm với ** \ r ** trước mỗi ** \ n ** vì vậy giải pháp cuối cùng trong trường hợp của tôi là '/ (\ r \ n) { 2,} (?!. * (\ R \ n) {2})/s' – IncreMan

+0

Thực ra, đó là nơi '\ R' có ích -'/\ R {2,} (?!. * \ R { 2})/s', '\ R' khớp với bất kỳ ngắt dòng nào, CRLF, CR và LF. –

Các vấn đề liên quan