如何在Ruby中修剪字符串中的特定字符?

Cri*_*ano 77 ruby string trim

我有几个字符串,如下所示:

"((String1))"
Run Code Online (Sandbox Code Playgroud)

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

Aru*_*hit 152

使用以下操作String#tr:

 "((String1))".tr('()', '')
 # => "String1"
Run Code Online (Sandbox Code Playgroud)

  • 还有一个破坏性版本`tr!`,它将就地修改一个字符串,比如`my_string.tr!(')(','')` (7认同)
  • 请注意,此功能不是从开头或结尾修剪,而是完全替换字符串中的所有文本. (7认同)
  • 误导和错误.Tr不是修剪功能,它是替换功能.这两个是非常不同的操作. (3认同)

jbr*_*jbr 38

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

s = "((String1))"
s = s[2...-2]
p s # => "String1"
Run Code Online (Sandbox Code Playgroud)

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

s = "((String1))"
s.delete! '()'
p s #  => "String1"
Run Code Online (Sandbox Code Playgroud)

  • 这将删除所有括号,甚至是字符串中间的括号,这看似不是OP想要的.如果这是想要的,这是最优雅的解决方案. (8认同)

fal*_*tru 19

使用String#gsub正则表达式:

"((String1))".gsub(/^\(+|\)+$/, '')
# => "String1"
"(((((( parentheses )))".gsub(/^\(+|\)+$/, '')
# => " parentheses "
Run Code Online (Sandbox Code Playgroud)

这将仅删除周围的括号.

"(((((( This (is) string )))".gsub(/^\(+|\)+$/, '')
# => " This (is) string "
Run Code Online (Sandbox Code Playgroud)

  • 第二个示例为+1(仅删除括号)。 (2认同)

dai*_*no3 14

对于那些遇到这种情况并寻找性能的人来说,它看起来#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
Run Code Online (Sandbox Code Playgroud)

  • 四年后... :-) 我发现如果我将你的基准测试提高几个数量级(1_000_000 次运行),那么使用上面使用的相同代码,我确实会比 tr 运行得稍快,删除速度约为tr 的比率为 0.92,gsub 略小于删除的 1.5 倍(实际上约为删除的 1.46,以及约为 tr 的 1.39)。嗯,当然。这是在 2018 MBP 13 上的 Ruby 2.6.3 上进行的。感谢您对这三种方法进行基准测试! (4认同)