2009-10-26 18 views
12

Là một phần của một chuỗi hoạt động lớn hơn, tôi đang cố gắng lấy các khối mã thông báo của một chuỗi lớn hơn và loại bỏ dấu chấm câu, từ khóa không phải từ, v.v. nỗ lực ban đầu sử dụng String#gsub\W regexp tính chất giai cấp, như vậy:Các chuỗi ký tự # gsub, unicode và non-word của Ruby

my_str = "Hello," 
processed = my_str.gsub(/\W/,'') 
puts processed # => Hello 

siêu, siêu, siêu đơn giản. Tất nhiên, bây giờ tôi đang mở rộng chương trình của tôi để đối phó với các nhân vật không phải Latin, và tất cả các heck bị hỏng lỏng lẻo. Ruby của \W có vẻ là một cái gì đó giống như [^A-Za-z0-9_], trong đó, tất nhiên, loại trừ các công cụ với dấu phụ (ü, í, vv). Vì vậy, bây giờ tai nạn của tôi trước đây, đơn giản mã và bỏng trong cách unpleasent:

my_str = "Quística." 
processed = my_str.gsub(/\W/,'') 
puts processed # => Qustica 

ý rằng Gsub() sốt sắng loại bỏ các "í" ký tự có dấu. Một cách mà tôi đã nghĩ đến để sửa lỗi này là mở rộng danh sách trắng của Ruby để bao gồm các điểm mã Unicode cao hơn, nhưng có rất nhiều điểm, và tôi biết tôi sẽ bỏ lỡ một số và gây ra sự cố xuống dòng (và chúng ta thậm chí không bắt đầu suy nghĩ về các ngôn ngữ không phải tiếng Latin ...). Một giải pháp khác là liệt kê tất cả nội dung tôi muốn xóa (dấu chấm câu, $ /%/&/™, v.v.), nhưng, một lần nữa, có rất nhiều điều đó và tôi thực sự không muốn bắt đầu chơi danh sách đen-whack-a-nốt ruồi.

Có ai ngoài đó tìm thấy giải pháp chính cho vấn đề này không? Có một số phiên bản Unicode thân thiện với Unicode của \W mà tôi chưa phát hiện được không? Cảm ơn!

Trả lời

12

Bạn cần chạy ruby ​​bằng tùy chọn "-Ku" để sử dụng tùy chọn UTF-8. Xem tài liệu cho command-line options. Đây là những gì xảy ra khi tôi làm điều này với irb:

% irb -Ku 
irb(main):001:0> my_str = "Quística." 
=> "Quística." 
irb(main):002:0> processed = my_str.gsub(/\W/,'') 
=> "Quística" 
irb(main):003:0> 

Bạn cũng có thể đặt nó trên #! dòng trong tập lệnh ruby ​​của bạn:

#!/usr/bin/ruby -Ku 
+0

Gah. Tôi nghĩ tôi đã ở chế độ UTF-8. Điều đó sắp xếp mọi thứ, nhờ sự giúp đỡ! –

4

Tôi chỉ muốn thêm rằng trong 1.9.1 nó hoạt động theo mặc định.

$ irb 
ruby-1.9.1-p243 > my_str = "Quística." 
=> "Quística." 
ruby-1.9.1-p243 > processed = my_str.gsub(/\W/,'') 
=> "Quística" 
ruby-1.9.1-p243 > processed.encoding 
=> #<Encoding:UTF-8> 

PS. Không có gì đánh bại rvm để thử các phiên bản khác nhau của Ruby. DS.

+0

Ooooh, điều đó thật tuyệt vời để xem. Tôi đã không nhận được xung quanh để chơi với 1.9 được nêu ra, nhưng tôi vui mừng khi thấy rằng nó địa chỉ một số ký tự mã hóa ký tự 1.8. –

+0

Nó không chỉ giải quyết một số trong số họ, nó địa chỉ tất cả chúng. Và tất cả của Java, C++, Python, PHP, ... cũng vậy. Hệ thống mã hóa của Ruby 1.9 có lẽ là phần mềm mạnh mẽ nhất, hoàn thiện nhất, với ngoại lệ có thể chỉ có ELisp. Nó cũng * trông * cực kỳ phức tạp, nhưng đó là bởi vì mã hóa * là * phức tạp. Mã hóa của Java có thể * trông * đơn giản hơn, nhưng bạn đã bao giờ thấy một đoạn Java phức tạp vừa thực sự * sử dụng * 'String' chưa? Không, tất cả các trình phân tích cú pháp, bộ giải mã, trình biên dịch, các công cụ Regexp, các thư viện XML thực sự sử dụng 'byte []', chính xác * vì * 'Chuỗi' quá đơn giản. –

+3

Vâng, tôi chắc chắn sẽ phải kiểm tra nó ra sớm, sau đó. Tôi thề, nếu tôi có thể giao dịch, nói, một quả thận không bao giờ phải đối phó với vấn đề mã hóa ký tự khác một lần nữa cho phần còn lại của cuộc đời tôi, tôi thực sự có thể xem xét thỏa thuận. Ý tôi là, hãy quên đi tất cả các vấn đề mã hóa phức tạp, thật sự - chỉ xem xét những câu hỏi nhỏ bé như cái tôi đã mô tả trong câu hỏi ban đầu, có bao nhiêu giờ tập thể trong cuộc sống của chúng ta. Tôi sẽ nói với bạn: Way. Quá. Nhiều người. –

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