Как обрезать определенные символы из строки в Ruby?
У меня есть несколько строк, которые выглядят так:
"((String1))"
они все разной длины. Как я могу удалить скобки из всех этих строк в цикле?
5 ответов:
сделать, как показано ниже с помощью
String#tr
:"((String1))".tr('()', '') # => "String1"
Если вы просто хотите, чтобы удалить первые два символа и последние два, то вы можете использовать отрицательные индексы в строке:
s = "((String1))" s = s[2...-2] p s # => "String1"
Если вы хотите удалить все скобки из строки, вы можете использовать удалить метод в строковом классе:
s = "((String1))" s.delete! '()' p s # => "String1"
используя
String#gsub
С помощью регулярного выражения:"((String1))".gsub(/^\(+|\)+$/, '') # => "String1" "(((((( parentheses )))".gsub(/^\(+|\)+$/, '') # => " parentheses "
при этом будут удалены только окружающие скобки.
"(((((( This (is) string )))".gsub(/^\(+|\)+$/, '') # => " This (is) string "
для тех, кто сталкивается с этим и ищет производительность, это выглядит как
#delete
и#tr
примерно одинаковы по скорости и в 2-4 раза быстрее, чем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) с помощью
Negative character class pattern matching
irb(main)> "((String1))"[/[^()]+/] => "String1"
^
- соответствует все, что не в классе символов. Внутри класса символов, то есть(
и)
или с глобальной заменой "AKA: gsub", как упоминали другие.
irb(main)> "((String1))".gsub(/[)(]/, '') => "String1"