2011-11-01 14 views

Odpowiedz

86

Zastosowanie #sub:

a.sub('bar', "BAR") 
+3

podziękować! Używałem gsub(), które zastępuje wszystkie wystąpienia. – Sayuj

11

String#sub to, co trzeba, jak Yossi już powiedział. Ale chciałbym użyć wyrażenia regularnego zamiast, ponieważ jest to szybsze:

a = 'foobarfoobarhmm' 
output = a.sub(/foo/, 'BAR') 
+0

Po prostu wykonałem test porównawczy, a wyrażenie regularne zajmuje o 50% więcej czasu niż użycie łańcucha jako parametru dla sub. –

+0

Sprawdziłem to, a wersja Regexp jest szybsza. Użyłem MRI 1.9.2, 1.9.3, 2.0.0, a nawet JRuby, wszystkie były szybsze w wersji Regexp. Kod testu porównawczego: https://gist.github.com/tbuehlmann/5574713 Chcesz podać swój benchmark? – tbuehlmann

+0

Hmmmm. Muszę przeprosić za moje twierdzenie, wydaje mi się, że popełniłem błąd w moim benchmarku. W rzeczywistości regex jest szybszy. –

5

zastąpić pierwsze wystąpienie, po prostu to zrobić:

str = "Hello World" 
str['Hello'] = 'Goodbye' 
# the result is 'Goodbye World' 

można nawet użyć wyrażeń regularnych:

str = "I have 20 dollars" 
str[/\d+/] = 500.to_s 
# will give 'I have 500 dollars' 
+0

'500.to_s' jest czasami zapisywane' "500" '. :-) –

+1

Napisałem to tak celowo. aby wskazać, że musisz przypisać ciąg jawny. Ponieważ konwersja nie jest tutaj automatyczna. Jeśli zrobisz to zamiast 'str [/ \ d + /] = 500' otrzymasz błąd' TypeError: no niejawna konwersja Fixnum do String'. –

Powiązane problemy