У мене є кілька рядків, які виглядають так:
"((String1))"
Всі вони різної довжини. Як я міг видалити дужки з усіх цих рядків у циклі?
У мене є кілька рядків, які виглядають так:
"((String1))"
Всі вони різної довжини. Як я міг видалити дужки з усіх цих рядків у циклі?
Відповіді:
Зробіть, як показано нижче, використовуючи String#tr
:
"((String1))".tr('()', '')
# => "String1"
tr!
яка змінить рядок на місці, наприкладmy_string.tr!(')(','')
Якщо ви просто хочете видалити перші два символи та останні два, тоді ви можете використовувати негативні індекси у рядку:
s = "((String1))"
s = s[2...-2]
p s # => "String1"
Якщо ви хочете видалити всі дужки зі рядка, ви можете скористатися методом delete у класі рядків:
s = "((String1))"
s.delete! '()'
p s # => "String1"
Для тих, хто стикається з цим і шукає продуктивності, це виглядає #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
Використання String#gsub
з регулярним виразом:
"((String1))".gsub(/^\(+|\)+$/, '')
# => "String1"
"(((((( parentheses )))".gsub(/^\(+|\)+$/, '')
# => " parentheses "
Це видалить лише оточуючі дужки.
"(((((( This (is) string )))".gsub(/^\(+|\)+$/, '')
# => " This (is) string "
Ось ще коротший спосіб досягнення цього:
1) з використанням Negative character class pattern matching
irb(main)> "((String1))"[/[^()]+/]
=> "String1"
^
- Відповідає нічому, що НЕ в класі персонажів. Всередині класу charachter ми маємо (
і)
Або із глобальною заміною "AKA: gsub", як згадували інші.
irb(main)> "((String1))".gsub(/[)(]/, '')
=> "String1"
((a))b
. Перший повернеться лише a
, другий повернетьсяab