Giả sử bạn có chuỗi sau:Thay thế nhiều chuỗi con trong Java khi văn bản thay thế chồng chéo văn bản tìm kiếm
cat dog fish dog fish cat
Bạn muốn thay thế tất cả cats
với dogs
, tất cả dogs
với fish
, và tất cả fish
với cats
. Bằng trực giác, kết quả mong đợi:
dog fish cat fish cat dog
Nếu bạn cố gắng giải pháp rõ ràng, Looping qua với replaceAll()
, bạn nhận được:
- (bản gốc)
cat dog fish dog fish cat
- (cat -> chó)
dog dog fish dog fish dog
- (chó -> cá)
fish fish fish fish fish fish
- (cá -> mèo)
cat cat cat cat cat cat
Rõ ràng, đây không phải là kết quả mong muốn. Vậy cách đơn giản nhất để làm điều này là gì? Tôi có thể cobble một cái gì đó cùng với Pattern
và Matcher
(và rất nhiều Pattern.quote()
và Matcher.quoteReplacement()
), nhưng tôi từ chối không tin rằng tôi là người đầu tiên có vấn đề này và không có chức năng thư viện để giải quyết nó.
(FWIW, các trường hợp thực tế là một chút phức tạp hơn và không liên quan đến giao dịch hoán đổi thẳng.)
Điều này dường như bị cấm rõ ràng, ít nhất là trong StringUtils 2.5 trở về trước: "Ném: IllegalArgumentException - nếu tìm kiếm lặp lại và có vòng lặp vô tận do đầu ra của đầu vào là đầu vào khác". (Mặc dù những gì tôi thực sự nhận được là một IllegalStateException như đệ quy không ngăn chặn đúng cách.) –
Tôi bối rối. Phương pháp tôi trích dẫn ở trên (mà tôi đã sao chép trực tiếp từ javadocs trực tuyến) thậm chí không xuất hiện. Không có replaceEach với tham số boolean cuối cùng. Mặt khác 'StringUtils.replaceEach (" abcde ", String mới [] {" ab "," cd "}, chuỗi mới [] {" cd "," ab "})' trả về '" cdabe "' có vẻ như chính xác. Tôi đã kiểm tra điều này trên 2,5 –
Ok, một số rõ ràng. 'replaceEachRepeatedly' ném' IllegalStateException' như bạn đã viết. 'replaceEach' với tham số' boolean' cuối cùng không tồn tại. 'replaceEach' không có tham số' boolean' cuối cùng dường như thực hiện công việc. –