2011-11-01 38 views

Trả lời

86

Sử dụng #sub:

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

cảm tạ! tôi đã sử dụng gsub() thay thế tất cả các lần xuất hiện. – Sayuj

11

String#sub là những gì bạn cần, như Yossi đã nói. Nhưng tôi muốn sử dụng một biểu thức chính quy thay vào đó, vì nó nhanh hơn:

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

Tôi chỉ làm một điểm chuẩn và regex mất 50% dài hơn chỉ bằng cách sử dụng một chuỗi như tham số cho phụ. –

+0

Tôi đã kiểm tra và phiên bản Regexp nhanh hơn. Tôi đã sử dụng MRI 1.9.2, 1.9.3, 2.0.0 và thậm chí JRuby, tất cả chúng đều nhanh hơn trên phiên bản Regexp. Mã điểm chuẩn: https://gist.github.com/tbuehlmann/5574713 Muốn cung cấp điểm chuẩn của bạn? – tbuehlmann

+0

Hmmmm. Tôi phải xin lỗi vì sự khẳng định của mình, có vẻ như tôi đã mắc lỗi trong điểm chuẩn của mình. Regex thực sự nhanh hơn. –

5

để thay thế sự xuất hiện đầu tiên, chỉ cần làm điều này:

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

bạn thậm chí có thể sử dụng biểu thức thông thường:

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

'500.to_s' đôi khi được viết là" 500 ". :-) –

+1

Tôi đã viết nó như thế. để chỉ ra rằng bạn cần gán một chuỗi rõ ràng. Bởi vì việc chuyển đổi không tự động ở đây. Nếu bạn làm điều này thay vì 'str [/ \ d + /] = 500' bạn sẽ nhận được một lỗi' TypeError: không có chuyển đổi ngầm định của Fixnum thành String'. –

Các vấn đề liên quan