Spowoduje to usunięcie wszystkich nawiasów, nawet tych w środku ciągu, co (pozornie) nie jest tym, czego chce OP. Jeśli tego chcemy, to jest to najbardziej eleganckie rozwiązanie.
Przywróć Monikę - notmaynard
22
Dla tych, którzy się z tym spotykają i szukają wydajności, wygląda na to #deletei #trsą mniej więcej takie same pod względem szybkości i 2-4x szybsze niż gsub.
Cztery lata później ... :-) stwierdzę, że jeśli podniosę twój benchmarking o kilka rzędów wielkości (1_000_000 uruchomień), że przy tym samym kodzie, którego użyłeś powyżej, usuwam działanie nieco szybciej niż tr, z usunięciem około stosunek tr wynosi 0,92, a gsub nieco mniej niż 1,5 raza usunięcia (właściwie ~ 1,46 usunięcia i ~ 1,39 tr). ymmv oczywiście. To jest w Rubim 2.6.3 na MBP 13 z 2018 roku. Dziękujemy za testowanie tych trzech metod!
Odpowiedzi:
Wykonaj poniższe czynności, używając
String#tr
:"((String1))".tr('()', '') # => "String1"
źródło
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"
źródło
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
źródło
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 "
źródło
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"
źródło
((a))b
. Pierwsza tylko powrócia
, drugaab