2010-07-02 38 views
14

Trong Python, chúng ta có thể sử dụng phương pháp .strip() của một chuỗi để loại bỏ sự xuất hiện ở đầu hoặc cuối của các nhân vật được lựa chọn:của Ruby chuỗi dải định nghĩa nhân vật

>>>print " (Removes (only) leading & trailing brackets & ws) ".strip("()") 
'Removes (only) leading & trailing brackets & ws'

Làm thế nào để chúng tôi làm điều này trong Ruby? Phương thức strip của Ruby không có đối số và chỉ dải trắng.

Trả lời

11

Không có phương pháp như vậy trong ruby, nhưng bạn có thể dễ dàng xác định nó như:

def my_strip(string, chars) 
    chars = Regexp.escape(chars) 
    string.gsub(/\A[#{chars}]+|[#{chars}]+\z/, "") 
end 

my_strip " [la[]la] ", " []" 
#=> "la[]la" 
+0

+1: Tôi thích điều này. Nó cũng giống như '# {chars}' automagically thoát regex metacharacters - đúng không? Nếu nó chỉ là thay thế chuỗi, regex sẽ không hoạt động trong ví dụ của bạn. Tuy nhiên, bạn có thể muốn sử dụng '\ A' và' \ Z' thay vì '^' và '$' - những cái sau cũng sẽ khớp với các dòng mới có thể không được mong muốn. –

+0

@Tim: '# {}' không thoát - đó là lý do tại sao tôi có lệnh gọi Regexp.escape trong đó. Điểm tốt về \ A và \ Z. – sepp2k

+0

Ồ. Lỗi của tôi - (Tôi không thể tin được). –

0

Thử gsub phương pháp:

irb(main):001:0> "[foo ]".gsub(/\As+[/,'') 
=> "foo ]" 

irb(main):001:0> "foo ]".gsub(/s+]\Z/,'') 
=> "foo" 

, vv

+1

này, giống như tất cả các câu trả lời khác, loại bỏ tất cả các lần xuất hiện của các nhân vật nhất định. OP chỉ muốn loại bỏ các lần xuất hiện ở hai đầu của chuỗi (như dải, nhưng không chỉ cho khoảng trắng). – sepp2k

+0

Rất tiếc, suy nghĩ^khớp với phần đầu của chuỗi. Đã thay đổi. – Peter

+0

@Peter: Tôi đã không thực sự nhìn thấy^(có thể là vì nó đã được ở phía trước của mở '/' thay vì đằng sau nó). Nhưng '\ A' là chính xác hơn, vâng. +1 – sepp2k

3
"[[ ] foo [] boo ][ ]".gsub(/\A[ \[\]]+|[ \[\]]+\Z/,'') 
=> "foo [] boo" 
thể

cũng hãy rút ngắn thành

"[[ ] foo [] boo ][ ]".gsub(/\A[][ ]+|[][ ]+\Z/,'') 
=> "foo [] boo" 
2

Không có phương pháp như vậy trong ruby, nhưng bạn có thể dễ dàng xác định nó như:

class String 
    alias strip_ws strip 
    def strip chr=nil 
     return self.strip_ws if chr.nil? 
     self.gsub /^[#{Regexp.escape(chr)}]*|[#{Regexp.escape(chr)}]*$/, '' 
    end 
end 

nào sẽ làm hài lòng các yêu cầu yêu cầu:

> "[ [] foo [] boo [][]] ".strip(" []") 
=> "foo [] boo" 

Trong khi vẫn làm những gì bạn mong muốn trong hoàn cảnh ít khắc nghiệt hơn.

> ' _bar_ '.strip.strip('_') 
=> "bar" 

nJoy!

2

Thử String#delete phương pháp: (avaiable trong 1.9.3, không chắc chắn về các phiên bản khác)

Ex:

1.9.3-p484 :003 > "hehhhy".delete("h") 
    => "ey" 
+6

Đây không phải là câu hỏi được yêu cầu. –

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