Mam kilka ciągów, które wyglądają tak:
"((String1))"
Wszystkie mają różne długości. Jak mogę usunąć nawiasy ze wszystkich tych ciągów w pętli?
Mam kilka ciągów, które wyglądają tak:
"((String1))"
Wszystkie mają różne długości. Jak mogę usunąć nawiasy ze wszystkich tych ciągów w pętli?
Odpowiedzi:
Wykonaj poniższe czynności, używając String#tr
:
"((String1))".tr('()', '')
# => "String1"
tr!
, która modyfikuje ciąg w miejscu, na przykładmy_string.tr!(')(','')
Jeśli chcesz tylko usunąć pierwsze dwa znaki i ostatnie dwa, możesz użyć indeksów ujemnych w ciągu:
s = "((String1))"
s = s[2...-2]
p s # => "String1"
Jeśli chcesz usunąć wszystkie nawiasy z ciągu, możesz użyć metody delete w klasie string:
s = "((String1))"
s.delete! '()'
p s # => "String1"
Dla tych, którzy się z tym spotykają i szukają wydajności, wygląda na to #delete
i #tr
są mniej więcej takie same pod względem szybkości i 2-4x szybsze niż 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
Używanie String#gsub
z wyrażeniem regularnym:
"((String1))".gsub(/^\(+|\)+$/, '')
# => "String1"
"(((((( parentheses )))".gsub(/^\(+|\)+$/, '')
# => " parentheses "
Spowoduje to usunięcie tylko otaczających nawiasów.
"(((((( This (is) string )))".gsub(/^\(+|\)+$/, '')
# => " This (is) string "
Oto jeszcze krótszy sposób osiągnięcia tego:
1) za pomocą Negative character class pattern matching
irb(main)> "((String1))"[/[^()]+/]
=> "String1"
^
- Pasuje do wszystkiego, co NIE należy do klasy postaci. W klasie charachter mamy (
i)
Lub z globalnym zastąpieniem „AKA: gsub”, jak wspominali inni.
irb(main)> "((String1))".gsub(/[)(]/, '')
=> "String1"
((a))b
. Pierwsza tylko powróci a
, drugaab