2010-07-02 15 views
14

zdefiniowane w Pythonie, możemy użyć metody .strip() z ciągiem do usunięcia początkowych lub końcowych wystąpień wybranych znaków:Ruby taśmy ciąg znaków

>>>print " (Removes (only) leading & trailing brackets & ws) ".strip("()") 
'Removes (only) leading & trailing brackets & ws'

Jak mamy to zrobić w Ruby? Metoda Ruby'ego strip nie przyjmuje argumentów i usuwa tylko białe spacje.

Odpowiedz

11

Nie ma takiej metody w ruby, ale łatwo można określić to lubią:

def my_strip(string, chars) 
    chars = Regexp.escape(chars) 
    string.gsub(/\A[#{chars}]+|[#{chars}]+\z/, "") 
end 

my_strip " [la[]la] ", " []" 
#=> "la[]la" 
+0

+1: Podoba mi się to. Wygląda również na to, że '# {chars} automagicznie wymyka się metaznakom regex - czy tak? Jeśli było to tylko zastępowanie ciągiem, regex nie powinien działać w twoim przykładzie. Możesz jednak użyć '\ A' i' \ Z' zamiast '^' i '$' - te ostatnie będą również dopasowywać się do nowych linii, które mogą nie być pożądane. –

+0

@Tim: '# {}' nie ucieka - dlatego mam połączenie z Regexp.escape. Dobry punkt o \ A i \ Z. – sepp2k

+0

Oh. Moja wina - (wer lesen kann, ist klar im Vorteil). –

0

spróbować metody gsub:

irb(main):001:0> "[foo ]".gsub(/\As+[/,'') 
=> "foo ]" 

irb(main):001:0> "foo ]".gsub(/s+]\Z/,'') 
=> "foo" 

itp

+1

ta, podobnie jak wszystkich innych odpowiedzi, usuwa wszystkie wystąpienia danego znaków. OP tylko chce usunąć wystąpienia na każdym końcu ciągu (jak pasek, ale nie tylko dla białych znaków). – sepp2k

+0

Whoops, thought^dopasował początek ciągu. Zmieniono. – Peter

+0

@Peter: Tak naprawdę nie widziałem^(co może być spowodowane tym, że znajdował się przed otwarciem '/' zamiast za nim). Ale "\ A" jest bardziej poprawne, tak. +1 – sepp2k

3
"[[ ] foo [] boo ][ ]".gsub(/\A[ \[\]]+|[ \[\]]+\Z/,'') 
=> "foo [] boo" 

Może również skrócić do

"[[ ] foo [] boo ][ ]".gsub(/\A[][ ]+|[][ ]+\Z/,'') 
=> "foo [] boo" 
2

Nie ma takiej metody w ruby, ale łatwo można określić to lubią:

class String 
    alias strip_ws strip 
    def strip chr=nil 
     return self.strip_ws if chr.nil? 
     self.gsub /^[#{Regexp.escape(chr)}]*|[#{Regexp.escape(chr)}]*$/, '' 
    end 
end 

która spełni wymagane warunki:

> "[ [] foo [] boo [][]] ".strip(" []") 
=> "foo [] boo" 

Choć nadal robi to, czego można się spodziewać w mniej ekstremalne okoliczności.

> ' _bar_ '.strip.strip('_') 
=> "bar" 

nJoy!

2

spróbować metody String#delete: (dostarczony w 1.9.3, nie wiem o innych wersjach)

Ex:

1.9.3-p484 :003 > "hehhhy".delete("h") 
    => "ey" 
+6

To nie jest to, o co pytano. –

Powiązane problemy