94

我有几个看起来像这样的字符串:

"((String1))"

它们都是不同的长度。如何在循环中从所有这些字符串中删除括号?

4

5 回答 5

184

Do as below using String#tr :

 "((String1))".tr('()', '')
 # => "String1"
于 2013-10-28T14:42:36.787 回答
44

如果您只想删除前两个字符和后两个字符,则可以在字符串上使用负索引:

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

如果要从字符串中删除所有括号,可以使用字符串类的delete方法:

s = "((String1))"
s.delete! '()'
p s #  => "String1"
于 2013-10-28T14:44:58.513 回答
25

对于遇到这种情况并寻求性能的人来说,它看起来#delete#tr速度差不多,比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
于 2015-08-18T17:59:47.290 回答
21

使用String#gsub正则表达式:

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

这将仅删除周围的括号。

"(((((( This (is) string )))".gsub(/^\(+|\)+$/, '')
# => " This (is) string "
于 2013-10-28T14:41:23.657 回答
1

这是实现此目的的更短的方法:

1)使用Negative character class pattern matching

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

^- 匹配任何不在字符类中的东西。在 charachter 类中,我们()

或者像其他人提到的那样使用全局替换“AKA:gsub”。

irb(main)> "((String1))".gsub(/[)(]/, '')
=> "String1"
于 2017-07-08T18:22:25.857 回答