Buna benzeyen birkaç dizim var:
"((String1))"
Hepsi farklı uzunluklardadır. Bir döngüde tüm bu dizelerden parantezleri nasıl kaldırabilirim?
Buna benzeyen birkaç dizim var:
"((String1))"
Hepsi farklı uzunluklardadır. Bir döngüde tüm bu dizelerden parantezleri nasıl kaldırabilirim?
Yanıtlar:
Aşağıdakileri kullanarak yapın String#tr
:
"((String1))".tr('()', '')
# => "String1"
tr!
Bir dizeyi yerinde değiştirecek yıkıcı bir sürüm de var , örneğinmy_string.tr!(')(','')
Yalnızca ilk iki karakteri ve son ikisini kaldırmak istiyorsanız , dizede negatif dizinler kullanabilirsiniz :
s = "((String1))"
s = s[2...-2]
p s # => "String1"
Dizeden tüm parantezleri kaldırmak istiyorsanız , dize sınıfında silme yöntemini kullanabilirsiniz :
s = "((String1))"
s.delete! '()'
p s # => "String1"
O bu genelinde geliyor ve performans arayan için, benziyor #delete
ve #tr
2-4x daha hızlı hız aynı ve hakkındadır 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
String#gsub
Normal ifadeyle kullanmak :
"((String1))".gsub(/^\(+|\)+$/, '')
# => "String1"
"(((((( parentheses )))".gsub(/^\(+|\)+$/, '')
# => " parentheses "
Bu, yalnızca çevreleyen parantezleri kaldıracaktır.
"(((((( This (is) string )))".gsub(/^\(+|\)+$/, '')
# => " This (is) string "
İşte bunu başarmanın daha da kısa bir yolu:
1) kullanarak Negative character class pattern matching
irb(main)> "((String1))"[/[^()]+/]
=> "String1"
^
- Karakter sınıfında OLMAYAN herhangi bir şeyle eşleşir. Charachter sınıfının içinde (
ve)
Veya diğerleri gibi küresel ikame "AKA: gsub" ile.
irb(main)> "((String1))".gsub(/[)(]/, '')
=> "String1"
((a))b
. Birincisi sadece geri dönecek a
, ikincisi geri dönecekab