web-dev-qa-db-ja.com

Rubyの文字列から特定の文字をトリミングするにはどうすればよいですか?

次のような文字列がいくつかあります。

"((String1))"

それらはすべて異なる長さです。ループ内のこれらすべての文字列から括弧を削除するにはどうすればよいですか?

65
Cristiano

String#tr を使用して以下のようにします。

 "((String1))".tr('()', '')
 # => "String1"
142
Arup Rakshit

最初の2文字と最後の2文字を削除するだけの場合は、文字列で 負のインデックス を使用できます。

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

文字列からすべての括弧を削除する場合は、文字列クラスで delete メソッドを使用できます。

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

正規表現で String#gsub を使用する:

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

これにより、周囲の括弧のみが削除されます。

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

これに出くわしてパフォーマンスを探している人にとっては、#delete#trは速度がほぼ同じで、gsubよりも2倍から4倍速いようです。

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
11
daino3

これを実現するさらに短い方法を次に示します。

1)Negative character class pattern matchingを使用する

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

^-文字クラスにないものに一致します。 charachterクラス内には、()があります

または、他の人が言及したように、グローバル置換「AKA:gsub」を使用します。

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