2009-02-07 38 views
8

làm cách nào để thay thế 2 chuỗi trong cùng một thời điểm? Ví dụ chúng ta hãy nói rằng tôi có chuỗi như thế này:Thay thế 2 chuỗi cùng một lúc?

str1 = "AAAA BBBB CCCC dddd"

tôi muốn thay thế tất cả các "AAAA" với "CCCC" và mỗi "CCCC" với "AAAA" nhưng nếu tôi đã làm:

str1.gsub ("AAAA", "CCCC") # CCCC BBBB CCCC dddd

str1.gsub ("CCCC", "AAAA") # AAAA BBBB AAAA dddd

những gì tôi muốn str1 là "CCCC BBBB AAAA dddd"

Trả lời

14

câu trả lời chung:
Sử dụng một regex để phù hợp với cả hai AAAA và CCCC, sau đó thay thế mỗi trận đấu với CCCC và AAAA tương ứng.

chỉnh sửa để làm sáng tỏ sự nhầm lẫn

str1.gsub(/(AAAA|CCCC)/) { $1 == 'AAAA' ? 'CCCC' : 'AAAA' } 

chỉnh sửa tôi nghĩ ra một cách thanh lịch hơn quá :)

str1.gsub(/((AAAA)|(CCCC))/) { $2 ? 'CCCC' : 'AAAA' } 
+0

Đồng ý, điều đó giống như giải pháp tốt hơn nhiều so với các đề xuất khác. Tôi không thể tìm ra những gì regex sẽ được mặc dù. –

+0

Chỉ cần sử dụng toán tử luân phiên: AAAA | CCCC – Morendil

+0

Đồng ý Morendil, nhưng cú pháp thay thế sẽ như thế nào? Bạn sẽ cần phải đặt phát hiện của mình vào các nhóm như: (AAAA) | (CCCC) Và sau đó thực hiện một số loại sự phức tạp trong thay thế bằng \ 1 và \ 2. –

0

Có một tùy chọn để bạn có thể thay thế AAAA với một cái gì đó khác trước và sau đó tiếp tục?

str1.gsub("AAAA","WXYZ") # WXYZ BBBB CCCC DDDD 
str1.gsub("CCCC","AAAA") # WXYZ BBBB AAAA DDDD 
str1.gsub("WXYZ","CCCC") # CCCC BBBB AAAA DDDD 
+0

Chỉ cần cẩn thận khi chọn chuỗi tạm thời để thay thế AAAA bằng, không nên tồn tại trong chuỗi gốc. – alexandrul

+0

Không biết tại sao -1 lại ở đó ... Về mặt kỹ thuật, biểu thức chính quy (như một ngôn ngữ) không có bộ nhớ. tức là giải pháp chấp nhận ở trên không hoạt động. Alexandrul đã chỉ ra sự sụp đổ. biểu thức chính quy như một công cụ có thể làm những gì giải pháp được chấp nhận ... – Calyth

+0

"không hoạt động"? Huh –

0

Một giải pháp (mặc dù một cái gì đó dựa trên regex sẽ là tốt nhất) sẽ là một cái gì đó dọc theo dòng của việc tạo ra một hash thay thế như vậy, có thể được mở rộng khi cần thiết. Tôi chỉ nhanh chóng đặt điều này lại với nhau để chứng minh. Tôi chắc chắn với một tình yêu và chăm sóc nhiều hơn một chút, bạn có thể đến với một cái gì đó thanh lịch hơn mà làm việc dọc theo cùng một dòng như thực hiện này chỉ hoạt động cho các chuỗi với không gian.

str1 = "AAAA BBBB CCCC DDDD"  
replacements = { "AAAA" => "CCCC", "CCCC" => "AAAA", "XXXX" => "ZZZZ" } # etc... 

new_string = "" 
str1.split(" ").each do |s| 
    new_string += replacements[s] || s 
    new_string += " " 
end 

puts new_string # CCCC BBBB AAAA DDDD 
Các vấn đề liên quan