Thay thế các từ trong một chuỗi - Ruby


281

Tôi có một chuỗi trong Ruby:

sentence = "My name is Robert"

Làm thế nào tôi có thể thay thế bất kỳ một từ nào trong câu này một cách dễ dàng mà không cần sử dụng mã phức tạp hoặc vòng lặp?


Thay thế bằng cách nào? Thay thế một từ tùy ý (từ # 2), hoặc một từ cụ thể ( my)?
Máy xay sinh tố

Cảm ơn câu hỏi ngắn gọn, đơn giản và hữu ích của bạn. nó đã giúp tôi tìm ra giải pháp cho phong cách hashtag theo quan điểm của tôi
Stef Hej

Câu trả lời:


493
sentence.sub! 'Robert', 'Joe'

Sẽ không gây ra ngoại lệ nếu từ thay thế không có trong câu ( []=biến thể sẽ).

Làm thế nào để thay thế tất cả các trường hợp?

Ở trên chỉ thay thế phiên bản đầu tiên của "Robert".

Để thay thế tất cả các trường hợp, hãy sử dụng gsub/ gsub!(nghĩa là "thay thế toàn cầu"):

sentence.gsub! 'Robert', 'Joe'

Ở trên sẽ thay thế tất cả các trường hợp của Robert bằng Joe.


Điều này dường như chỉ thay thế phiên bản đầu tiên, tất nhiên đôi khi tốt và đôi khi không.
Jason Swett

@JasonSwett đã cập nhật câu trả lời để đề cập đến cách thay thế tất cả các trường hợp.
srcspider

128

Nếu bạn đang xử lý văn bản ngôn ngữ tự nhiên và cần thay thế một từ, không chỉ là một phần của chuỗi, bạn phải thêm một số cụm từ thông dụng vào gsub của bạn vì việc thay thế văn bản đơn giản có thể dẫn đến kết quả thảm hại:

'mislocated cat, vindicating'.gsub('cat', 'dog')
=> "mislodoged dog, vindidoging"

Biểu thức thông thường có ranh giới từ, chẳng hạn như \bbắt đầu hoặc kết thúc của một từ. Như vậy

'mislocated cat, vindicating'.gsub(/\bcat\b/, 'dog')
=> "mislocated dog, vindicating"

Trong Ruby, không giống như một số ngôn ngữ khác như Javascript, ranh giới từ tương thích với UTF-8, vì vậy bạn có thể sử dụng nó cho các ngôn ngữ có bảng chữ cái Latinh không phải là tiếng Latin hoặc mở rộng:

'сіль у кисіль, для весіль'.gsub(/\bсіль\b/, 'цукор')
=> "цукор у кисіль, для весіль"

6
Lưu ý rằng một số ngôn ngữ thậm chí không sử dụng khoảng trắng, vì vậy \bchúng không hoạt động trong đó, bạn sẽ cần sử dụng các máy phân tích hình thái hoặc những thứ tương tự như vậy trong những trường hợp đó. Ngoài ra, +1 cho ví dụ vui nhộn.
NiñoScript

57

Bạn có thể thử sử dụng theo cách này:

sentence ["Robert"] = "Roger"

Sau đó, câu sẽ trở thành:

sentence = "My name is Roger" # Robert is replaced with Roger

4
Điều đó khá thú vị. Tôi chưa bao giờ thấy phương pháp thay thế này trước đây.
Sean Hill

6
Bạn sẽ không gặp lỗi với phương thức này nếu chuỗi gốc không chứa từ bạn đang cố thay thế?
srcspider

2
Chỉ cần chắc chắn để nối lại IndexError. Mặt khác, đối với một từ không phải là một phần của câu sẽ dẫn đến:string not matched (IndexError)
Konrad Reiche

9
Một vấn đề khác với phương thức này là nó chỉ thay thế thể hiện đầu tiên của chuỗi.
Martin Konecny

14
Điều này là thú vị, nhưng chắc chắn không nên được đánh dấu là câu trả lời chính xác.
Niels Abildgaard

46

Đầu tiên, bạn không khai báo loại trong Ruby, vì vậy bạn không cần loại đầu tiên string .

Để thay thế một từ trong chuỗi, bạn làm : sentence.gsub(/match/, "replacement").

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.