Sie fordern eine Schleife an, um viele Zeichenfolgen zu ändern. Wie werden die Zeichenfolgen gespeichert?
Hirolau
Ich weiß, wie man eine Schleife durch alle Saiten macht. Ich wollte nur den Teil zur Manipulation der Saiten. Tut mir leid, dass ich das komisch formuliert habe
Es gibt auch eine destruktive Version tr!, die eine Zeichenfolge an Ort und Stelle modifiziert, wiemy_string.tr!(')(','')
bonh
8
Beachten Sie, dass diese Funktion nicht vom Anfang oder Ende abgeschnitten wird, sondern den gesamten Text in der Zeichenfolge vollständig ersetzt.
Jordanien
3
Irreführend und falsch. Tr ist keine Trimmfunktion, sondern eine Ersatzfunktion. Die beiden sind sehr unterschiedliche Operationen.
Zane Claes
1
@ ZaneClaes Ja. OP verwendete einen falschen Begriff, um zu erklären, was das OP tatsächlich will. Die Antwort hat gezeigt, wie die Ausgabe erreicht werden kann.
Arup Rakshit
39
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 Löschmethode für die Zeichenfolgenklasse verwenden:
s = "((String1))"
s.delete! '()'
p s # => "String1"
Dadurch werden alle Klammern gelöscht, auch die in der Mitte der Zeichenfolge, was (scheinbar) nicht das ist, was OP will. Wenn dies gewünscht wird, ist dies die eleganteste Lösung.
Vier Jahre später ... :-) Wenn ich Ihr Benchmarking um ein paar Größenordnungen (1_000_000 Läufe) erhöhe, stelle ich fest, dass mit demselben Code, den Sie oben verwenden, das Löschen etwas schneller als tr ausgeführt wird, wobei das Löschen bei etwa liegt ein Verhältnis von tr von 0,92 und g etwas weniger als das 1,5-fache von delete (tatsächlich ~ 1,46 von delete und ~ 1,39 von tr). ymmv natürlich. Dies ist auf Ruby 2.6.3 auf einem 2018 MBP 13. Vielen Dank für das Benchmarking dieser drei Methoden!
likethesky
1
Hier ist ein noch kürzerer Weg, um dies zu erreichen:
1) mit Negative character class pattern matching
irb(main)> "((String1))"[/[^()]+/]
=> "String1"
^- Entspricht allem, was NICHT in der Charakterklasse enthalten ist. Innerhalb der Charakterklasse haben wir (und)
Oder mit globaler Substitution "AKA: gsub" wie andere erwähnt haben.
Antworten:
Gehen Sie wie folgt vor
String#tr
:"((String1))".tr('()', '') # => "String1"
quelle
tr!
, die eine Zeichenfolge an Ort und Stelle modifiziert, wiemy_string.tr!(')(','')
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 Löschmethode für die Zeichenfolgenklasse verwenden:
s = "((String1))" s.delete! '()' p s # => "String1"
quelle
Verwenden
String#gsub
mit regulären Ausdrücken:"((String1))".gsub(/^\(+|\)+$/, '') # => "String1" "(((((( parentheses )))".gsub(/^\(+|\)+$/, '') # => " parentheses "
Dadurch werden nur umgebende Klammern entfernt.
"(((((( This (is) string )))".gsub(/^\(+|\)+$/, '') # => " This (is) string "
quelle
Für diejenigen, die darauf stoßen und nach Leistung suchen, sieht es so aus
#delete
und#tr
ist ungefähr gleich schnell und 2-4x schneller alsgsub
.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
quelle
Hier ist ein noch kürzerer Weg, um dies zu erreichen:
1) mit
Negative character class pattern matching
irb(main)> "((String1))"[/[^()]+/] => "String1"
^
- Entspricht allem, was NICHT in der Charakterklasse enthalten ist. Innerhalb der Charakterklasse haben wir(
und)
Oder mit globaler Substitution "AKA: gsub" wie andere erwähnt haben.
irb(main)> "((String1))".gsub(/[)(]/, '') => "String1"
quelle
((a))b
. Der erste wird nur zurückkehrena
, der zweite wird zurückkehrenab