2013-10-28 25 views
47

Tôi có một số chuỗi trông giống như sau:Làm thế nào để cắt các ký tự cụ thể khỏi một chuỗi trong Ruby?

"((String1))" 

Chúng đều có độ dài khác nhau. Làm thế nào tôi có thể loại bỏ các dấu ngoặc đơn từ tất cả các chuỗi này trong một vòng lặp?

+2

Xóa dấu ngoặc đơn hoặc xóa hai ký tự đầu tiên và cuối cùng khỏi chuỗi "ngẫu nhiên"? (Thực tế ngẫu nhiên?) – iamnotmaynard

+0

"((String1))" [2 ...- 2] # => "String1" – iamnotmaynard

+1

http://www.ruby-doc.org/core-1.9.3/String.html – iamnotmaynard

Trả lời

111

làm như sau sử dụng String#tr:

"((String1))".tr('()', '') 
# => "String1" 
+6

Cũng có một phiên bản phá hoại 'tr!' Sẽ sửa đổi một chuỗi tại chỗ, như 'my_string.tr! (') (', '')' – bonh

+0

@bonh Có ... Cảm ơn bạn đã đề cập đến .. –

+2

Lưu ý rằng chức năng này không cắt tỉa từ đầu hoặc cuối, nhưng thay thế hoàn toàn trên tất cả văn bản trong chuỗi. – Jordan

13

Sử dụng String#gsub với biểu thức chính quy:

"((String1))".gsub(/^\(+|\)+$/, '') 
# => "String1" 
"((((((parentheses)))".gsub(/^\(+|\)+$/, '') 
# => " parentheses " 

này sẽ chỉ xóa ngoặc xung quanh.

"((((((This (is) string)))".gsub(/^\(+|\)+$/, '') 
# => " This (is) string " 
+1

+1 cho ví dụ thứ hai (chỉ loại bỏ dấu ngoặc đơn xung quanh). –

33

Nếu bạn chỉ muốn loại bỏ hai ký tự đầu tiên và cuối cùng hai, sau đó bạn có thể sử dụng negative indexes trên chuỗi:

s = "((String1))" 
s = s[2...-2] 
p s # => "String1" 

Nếu bạn muốn xóa tất cả các dấu ngoặc đơn khỏi chuỗi, bạn có thể sử dụng phương thức delete trên lớp chuỗi:

s = "((String1))" 
s.delete! '()' 
p s # => "String1" 
+7

Điều này sẽ xóa tất cả các dấu ngoặc đơn, ngay cả những dấu ngoặc ở giữa chuỗi, mà (dường như) không phải là những gì OP muốn. Nếu đó là những gì được mong đợi thì đây là giải pháp thanh lịch nhất. – iamnotmaynard

7

Đối với những người đến đây và tìm kiếm hiệu suất, có vẻ như #delete#tr có cùng tốc độ và 2-4x nhanh hơn gsub.

text = "Here is a string with/some forwa/rd slashes" 
tr = Benchmark.measure { 10000.times { text.tr('/', '') } } 
# tr.total => 0.01 
delete = Benchmark.measure { 10000.times { text.delete('/') } } 
# delete.total => 0.01 
gsub = Benchmark.measure { 10000.times { text.gsub('/', '') } } 
# gsub.total => 0.02 - 0.04 
1

Dưới đây là một cách thậm chí ngắn hơn để đạt được điều này:

1) sử dụng Negative character class pattern matching

irb(main)> "((String1))"[/[^()]+/] 
=> "String1" 

^ - Trận bất cứ điều gì KHÔNG trong lớp nhân vật. Bên trong lớp charachter, chúng tôi có ()

Hoặc thay thế toàn cầu "AKA: gsub" như những người khác đã đề cập.

irb(main)> "((String1))".gsub(/[)(]/, '') 
=> "String1" 
Các vấn đề liên quan