如何从Ruby中的字符串中删除特定字符?


82

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

"((String1))"

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


2
删除括号,还是从“随机”字符串中删除前两个和后两个字符?(实际上是随机的吗?)
恢复莫妮卡-notmaynard

“(((String1))” [2 ...- 2]#=>“ String1”
恢复莫妮卡-notmaynard 2013年


您要循环更改许多字符串,如何存储字符串?
hirolau

我知道如何遍历所有字符串,我只想使用字符串操作部分,抱歉,我说的很奇怪
Cristiano

Answers:


165

使用以下方法进行操作String#tr

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

7
还有一个破坏性的版本tr!可以修改字符串,例如my_string.tr!(')(','')
bonh

8
请注意,此函数不是从开头或结尾开始修剪,而是对字符串中所有文本的完整替换。
乔丹

3
误导和错误。Tr不是微调功能,而是替代功能。两者是非常不同的操作。
赞恩·克莱斯

1
@ZaneClaes是的。OP使用错误的术语来解释OP实际想要什么。答案显示了如何实现输出。
奥雅纳·拉克西特

39

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

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

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

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

8
这将删除所有括号,即使是字符串中间的括号也是如此,这似乎不是OP想要的。如果需要的话,这是最优雅的解决方案。
恢复莫妮卡– notmaynard

20

String#gsub与正则表达式一起使用:

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

这只会删除周围的括号。

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

2
第二个示例为+1(仅删除括号)。
2014年

20

穿过这片未来的那些,寻找性能,它看起来像#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快,而delete的运行时间大约是tr tr的比率为0.92,gsub的删除率略小于1.5倍(实际上约为删除的1.46,约为tr的1.39)。ymmv当然。这是基于2018 MBP 13的Ruby 2.6.3。感谢对这三种方法进行基准测试!
likethesky

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.