2013-06-16 48 views
5

Tôi gặp sự cố khi xóa các thẻ \n\r. Khi tôi sử dụng dấu ngoặc kép, nó hoạt động ok, nếu không nó sẽ để lại "/". Với gsub, nó không hoạt động mà không có dấu nháy kép. Tại sao?Xóa ngắt dòng trong Ruby

<%= "Remove \n".delete('\n') %> 
result: "Remove" 
<%= 'Remove \n'.delete('\n') %> 
result: "Remove \" 

Tôi thấy điều này bởi vì kết quả nó không hoạt động với các kết quả từ cơ sở dữ liệu ...

Trả lời

16

chuỗi đơn trích dẫn không xử lý hầu hết các trình tự thoát. Vì vậy, khi bạn có số điện thoại này

'\n' 

nghĩa đen là "hai ký tự, ký tự đầu tiên là dấu gạch chéo ngược và ký tự thứ hai là chữ thường 'n'". Nó không phải có nghĩa là "ký tự dòng mới". Để cho \n có nghĩa là newline char, bạn phải đặt nó bên trong chuỗi được trích dẫn kép (chuỗi này xử lý chuỗi thoát này). Dưới đây là một vài ví dụ:

"Remove \n".delete('\n') # => "Remove \n" # doesn't match 
'Remove \n'.delete('\n') # => "Remove \\" # see below 

'Remove \n'.delete("\n") # => "Remove \\n" # no newline in source string 
"Remove \n".delete("\n") # => "Remove " # properly removed 

LƯU Ý rằng nhân vật xuyệc ngược trong ví dụ cụ thể này (dòng thứ hai, sử dụng đơn trích dẫn chuỗi trong delete cuộc gọi) chỉ đơn giản là bỏ qua, bởi vì logic đặc biệt trong phương pháp delete. Xem tài liệu trên String#count để biết thêm thông tin. Để bỏ qua điều này, hãy sử dụng gsub, ví dụ:

'Remove \n'.gsub('\n', '') # => "Remove " 
+0

Cảm ơn Sergio. Có lẽ bạn biết làm thế nào tôi có thể chuyển đổi kết quả nhận được từ cơ sở dữ liệu, bởi vì tôi nghĩ rằng chúng được kéo như trong dấu nháy đơn – Gediminas

+0

Có lẽ tôi biết. Nhưng đó là phạm vi ở đây :) –

2

Từ Ruby Programming/Strings dấu ngoặc kép

Độc chỉ hỗ trợ hai trình tự thoát.

\' – single quote 
\\ – single backslash 

Trừ những chuỗi hai lối thoát, mọi thứ khác giữa dấu nháy đơn được xử lý theo nghĩa đen.

Vì vậy, nếu bạn nhập \n trong irb, bạn sẽ quay lại \\n.

Đây là lý do tại sao bạn có vấn đề với delete

"Remove \n".delete('\n') #=> "Remove \n".delete("\\n") => "Remove \n" 
'Remove \n'.delete('\n') #=> "Remove \\n".delete("\\n") => "Remove \\" 
+0

Dòng thứ hai của bạn tạo ra đầu ra khác nhau cho tôi. Bạn chắc chứ? –

+0

Xin lỗi vì lỗi đánh máy đó. –