Tôi có một số chuỗi trông như thế này:
"((String1))"
Chúng đều có độ dài khác nhau. Làm cách nào tôi có thể xóa dấu ngoặc đơn khỏi 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 như thế này:
"((String1))"
Chúng đều có độ dài khác nhau. Làm cách nào tôi có thể xóa dấu ngoặc đơn khỏi tất cả các chuỗi này trong một vòng lặp?
Câu trả lời:
Làm như bên dưới bằng cách sử dụng String#tr
:
"((String1))".tr('()', '')
# => "String1"
tr!
sẽ sửa đổi một chuỗi tại chỗ, nhưmy_string.tr!(')(','')
Nếu bạn chỉ muốn xóa hai ký tự đầu tiên và hai ký tự cuối cùng, thì bạn có thể sử dụng các chỉ mục phủ định 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 xóa trên lớp chuỗi:
s = "((String1))"
s.delete! '()'
p s # => "String1"
Sử dụng String#gsub
với biểu thức chính quy:
"((String1))".gsub(/^\(+|\)+$/, '')
# => "String1"
"(((((( parentheses )))".gsub(/^\(+|\)+$/, '')
# => " parentheses "
Thao tác này sẽ chỉ xóa các dấu ngoặc đơn xung quanh.
"(((((( This (is) string )))".gsub(/^\(+|\)+$/, '')
# => " This (is) string "
Đối với những người đi ngang qua này và tìm kiếm hiệu quả, nó trông giống như #delete
và #tr
khoảng giống nhau ở 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
Đây là một cách thậm chí còn ngắn hơn để đạt được điều này:
1) sử dụng Negative character class pattern matching
irb(main)> "((String1))"[/[^()]+/]
=> "String1"
^
- Đối sánh bất kỳ thứ gì KHÔNG trong lớp ký tự. Bên trong lớp charachter, chúng tôi có (
và)
Hoặc với thay thế toàn cầu "AKA: gsub" như những người khác đã đề cập.
irb(main)> "((String1))".gsub(/[)(]/, '')
=> "String1"
((a))b
. Lần đầu tiên sẽ chỉ trở lại a
, lần thứ hai sẽ trở lạiab