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?
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?
làm như sau sử dụng String#tr
:
"((String1))".tr('()', '')
# => "String1"
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 cho ví dụ thứ hai (chỉ loại bỏ dấu ngoặc đơn xung quanh). –
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"
Đ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
Đối với những người đến đây và tìm kiếm hiệu suất, có vẻ như #delete
và #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
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ó (
và )
Hoặc thay thế toàn cầu "AKA: gsub" như những người khác đã đề cập.
irb(main)> "((String1))".gsub(/[)(]/, '')
=> "String1"
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
"((String1))" [2 ...- 2] # => "String1" – iamnotmaynard
http://www.ruby-doc.org/core-1.9.3/String.html – iamnotmaynard