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?
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?
Câu trả lời:
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ẽ).
Ở 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.
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ư \b
bắ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/, 'цукор')
=> "цукор у кисіль, для весіль"
\b
chú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.
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
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)
my
)?