2012-04-27 33 views
9

Tôi đã cố gắng sử dụng gsub để xóa các ký tự không phải từ trong một chuỗi trong ứng dụng đường ray. Tôi đã sử dụng mã sau:Sự kỳ lạ với gsub

somestring.gsub(/[\W]/i, '') #=> "" 

nhưng thực sự không chính xác, nó cũng sẽ xóa thư k. Giá trị chính xác phải là:

somestring.gsub(/\W/i, '') #=> "kkk" 

Nhưng vấn đề của tôi là kiểm tra đơn vị bộ điều khiển ray có chứa mã trên sử dụng rspec không hoạt động, kiểm tra đơn vị thực sự chuyển. Vì vậy, tôi đã tạo một trường hợp thử nghiệm khá khắc nghiệt trong rspec

it "test this gsub" do 
    'kkk'.gsub(/[\W]/i, '').should == 'kkk' 
end 

trường hợp kiểm tra ở trên sẽ không thành công, nhưng nó thực sự chuyển. vấn đề ở đây là gì? Tại sao vượt qua bài kiểm tra?

+2

Tại sao thử nghiệm không thành công? '/ [\ W]/i' là một regexp hoàn toàn hợp lệ cho tác vụ đó theo như tôi thấy. Chân đế là không cần thiết trong trường hợp đó, nhưng nó không làm tổn thương bất cứ điều gì. –

+0

Bạn có thực sự thử regexps trong 'irb' không? '" kkk ".gsub (..)' nó hoạt động giống như nó nên, và kết quả là "kkk", vì vậy bài kiểm tra đã trôi qua. Kết quả bạn đang mong đợi là gì? – Casper

+1

@Casper Trên thực tế, khi chạy ''kkk'.gsub (/ [\ W]/i,' ')' Tôi nhận được '" "'. Trong khi đó, chạy ''kkk'.gsub (/ \ W/i,' ')' trả về '" kkk "'. –

Trả lời

5

Ruby 1.9 chuyển sang một công cụ biểu thức chính quy khác (Oniguruma), thay đổi hành vi. Điều này có vẻ như một lỗi trong đó.

Ví dụ, bạn có thể khắc phục vấn đề này bằng cách không xác định một trường hợp trận đấu nhạy cảm:

irb(main):001:0> 'kkk'.gsub(/[\W]/i, '') 
=> "" 
irb(main):002:0> 'kkk'.gsub(/[\W]/, '') 
=> "kkk" 
irb(main):004:0> 'kkk'.gsub(/\W/i, '') 
=> "kkk" 
irb(main):003:0> 'kkk'.gsub(/\W/, '') 
=> "kkk" 

Cập nhật: Dường như loại bỏ các nhóm nhân vật là cách tiếp cận khác. Có thể các trận đấu phủ định như thế không nhất thiết phải hợp lệ trong một nhóm nhân vật?

+0

Bạn có nghĩ rằng ... không có nó không thể ... nó lấy '\ W' và làm cho nó' \ w' bởi vì nó không phân biệt chữ hoa chữ thường? Nó thực sự không thể làm điều đó, đúng không ?? O_O –

+0

Tôi hy vọng không ... Nhưng bạn không bao giờ biết. Điều này có lẽ nên được đưa lên trên http://bugs.ruby-lang.org để xác nhận nơi đổ lỗi là – Nevir

+0

Lỗi được xác nhận tại đây http://www.rubular.com/. Bạn có thể chuyển đổi giữa 1.8.7 và 1.9.2 và thấy sự khác biệt. – Casper

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