Как удалить определенные символы из строки в Ruby?


85

У меня есть несколько строк, которые выглядят так:

"((String1))"

Все они разной длины. Как я мог убрать круглые скобки со всех этих строк в цикле?


2
Убрать круглые скобки или удалить первые два и последние два символа из «случайной» строки? (На самом деле случайно?)
Восстановить Монику - notmaynard

"((String1))" [2 ...- 2] # => "String1"
Восстановить Монику - notmaynard


Вы запрашиваете цикл для изменения многих строк, как хранятся строки?
hirolau

Я знаю, как сделать цикл через все струны, мне просто нужна была часть манипуляции со струнами, извините, я сформулировал это странно
Криштиану

Ответы:


168

Сделайте, как показано ниже, используя String#tr:

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

7
Также есть деструктивная версия tr!, которая изменяет строку на месте, напримерmy_string.tr!(')(','')
bonh

8
Обратите внимание, что эта функция не обрезка с начала или конца, а полная замена всего текста в строке.
Jordan

3
Вводящие в заблуждение и неверные. Tr - это не функция обрезки, это функция замены. Это две очень разные операции.
Zane Claes

1
@ZaneClaes Да. OP использовал неправильный термин, чтобы объяснить, чего на самом деле хочет OP. Ответ показал, как добиться результата.
Аруп Ракшит

42

Если вы просто хотите удалить первые два символа и последние два, вы можете использовать отрицательные индексы в строке:

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

Если вы хотите удалить все круглые скобки из строки, вы можете использовать метод удаления для класса строки:

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

8
Это удалит все круглые скобки, даже те, которые находятся в середине строки, что (по-видимому) не то, что хочет OP. Если это то, что нужно, это наиболее элегантное решение.
Восстановить Монику - notmaynard

22

Для тех , кто прибывает через это и ищет производительность, похоже , #deleteи #trпримерно такой же скорости и 2-4x быстрее 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

3
Четыре года спустя ... :-) Я обнаружил, что если я увеличу ваш бенчмаркинг на пару порядков (1_000_000 запусков), то с тем же кодом, который вы используете выше, я действительно получаю удаление, работающее немного быстрее, чем tr, с удалением примерно отношение tr 0,92, а gsub чуть меньше 1,5x удаления (фактически ~ 1,46 удаления и ~ 1,39 tr). ymmv конечно. Это на Ruby 2.6.3 на MBP 13 2018 года. Спасибо за тестирование этих трех методов!
likethesky

21

Использование String#gsubс регулярным выражением:

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

Это удалит только круглые скобки.

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

2
+1 для второго примера (удалите только круглые скобки).
Бхавнит Сингх Баджва

1

Вот еще более короткий способ добиться этого:

1) используя Negative character class pattern matching

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

^- Соответствует чему-либо НЕ в классе символов. Внутри класса charachter у нас есть (и)

Или с глобальной заменой «AKA: gsub», как упоминали другие.

irb(main)> "((String1))".gsub(/[)(]/, '')
=> "String1"

Ваши два ответа имеют разные результаты ((a))b. Первый только вернется a, второй вернетсяab
Ulysse BN
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.