it-swarm.com.de

Wie schneide ich bestimmte Zeichen aus einer Zeichenfolge in Ruby ab?

Ich habe mehrere Zeichenfolgen, die so aussehen:

"((String1))"

Sie sind alle unterschiedlich lang. Wie könnte ich die Klammern von all diesen Zeichenfolgen in einer Schleife entfernen?

70
Cristiano

Gehen Sie wie folgt vor, indem Sie String#tr :

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

Wenn Sie nur die ersten beiden Zeichen und die letzten beiden Zeichen entfernen möchten, können Sie negative Indizes für die Zeichenfolge verwenden:

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

Wenn Sie alle Klammern aus der Zeichenfolge entfernen möchten, können Sie die Methode delete für die Zeichenfolgenklasse verwenden:

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

Mit String#gsub mit regulärem Ausdruck:

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

Dadurch werden nur umgebende Klammern entfernt.

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

Für diejenigen, die darauf stoßen und Leistung suchen, sieht es aus wie #delete und #tr sind ungefähr gleich schnell und 2-4x schneller als 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
14
daino3

Hier ist ein noch kürzerer Weg, dies zu erreichen:

1) mit Negative character class pattern matching

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

^ - Stimmt mit nichts überein, was NICHT in der Zeichenklasse enthalten ist. In der Charakterklasse haben wir ( und )

Oder mit globaler Substitution "AKA: gsub" wie andere schon erwähnt haben.

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