Rubyで文字列から特定の文字を削除するにはどうすればよいですか?


85

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

"((String1))"

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


2
括弧を削除しますか、それとも「ランダムな」文字列から最初の2文字と最後の2文字を削除しますか?(実際にはランダムですか?)
モニカを復活させ

"((String1))" [2 ...- 2]#=> "String1"
モニカの復活-notmaynard 2013年


多くの文字列を変更するためのループを求めていますが、文字列はどのように保存されますか?
hirolau 2013年

文字列操作部分が欲しかったすべての文字列をループする方法を知っています。申し訳ありませんが、その奇妙な言葉を言いました
Cristiano

回答:


168

以下を使用して実行しますString#tr

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

7
次のtr!ように、文字列をインプレースで変更する破壊的なバージョンもありますmy_string.tr!(')(','')
bonh 2015年

8
この関数は最初または最後からトリミングされているのではなく、文字列内のすべてのテキストが完全に置き換えられていることに注意してください。
ジョーダン

3
誤解を招き、正しくありません。Trはトリミング機能ではなく、置換機能です。この2つは非常に異なる操作です。
Zane Claes 2018年

1
@ZaneClaesはい。OPは、OPが実際に何を望んでいるかを説明するために間違った用語を使用しました。答えは、出力を達成する方法を示しています。
ArupRakshit18年

42

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

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

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

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

8
これにより、文字列の途中にある括弧も含め、すべての括弧が削除されます。これは、(一見)OPが望んでいるものではありません。それが必要な場合、これは最もエレガントなソリューションです。
モニカの復活-notmaynard 2013年

22

この出くわすとパフォーマンスをお探しの方のために、それは次のようになります#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
4年後... :-)ベンチマークを数桁(1_000_000実行)上げると、上記で使用したのと同じコードで、削除がtrよりもわずかに速く実行され、削除が約trの比率は0.92、gsubは削除の1.5倍弱(実際には削除の約1.46、trの約1.39)。もちろんymmv。これは2018MBP13のRuby2.6.3にあります。これら3つの方法のベンチマークに感謝します!
likethesky

21

String#gsub正規表現での使用:

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

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

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

2
2番目の例では+1(周囲の括弧のみを削除)。
Bhavneet Singh Bajwa 2014

1

これを実現するさらに短い方法は次のとおりです。

1)使用する Negative character class pattern matching

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

^-文字クラスにないものと一致します。キャラクタークラスの中には()

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

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

あなたの2つの答えはで異なる結果をもたらし((a))bます。最初は戻るだけaで、2番目は戻るab
UlysseBN18年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.