2009-09-21 70 views
11

Tôi đã dành nửa giờ rưỡi để tìm cách chạy một tìm kiếm đơn giản và thay thế đối tượng string trong C++.Chuỗi Thay thế bằng C++

Tôi có ba đối tượng chuỗi.

string original, search_val, replace_val; 

Tôi muốn chạy một lệnh tìm kiếm trên original cho search_val và thay thế tất cả các lần xuất hiện với replace_val.

NB: Câu trả lời chỉ trong C++ thuần túy. Môi trường là XCode trên Mac OSX Leopard.

Trả lời

33

Một vòng lặp nên làm việc với tìm và thay thế

void searchAndReplace(std::string& value, std::string const& search,std::string const& replace) 
{ 
    std::string::size_type next; 

    for(next = value.find(search);  // Try and find the first match 
     next != std::string::npos;  // next is npos if nothing was found 
     next = value.find(search,next) // search for the next match starting after 
              // the last match that was found. 
     ) 
    { 
     // Inside the loop. So we found a match. 
     value.replace(next,search.length(),replace); // Do the replacement. 
     next += replace.length();      // Move to just after the replace 
                 // This is the point were we start 
                 // the next search from. 
    } 
} 
+0

bạn có thể giải thích cách mã của bạn hoạt động không? cảm ơn bạn :) –

+0

Đã thêm nhận xét. –

+0

Đó là một nit nhỏ để chọn, nhưng tên chức năng của bạn có một lỗi đánh máy ("Repalce") mà có vẻ một chút ra khỏi chỗ của bạn, rất thanh lịch và cũng được định dạng, mã. –

4
size_t start = 0; 
while(1) { 
    size_t where = original.find(search_val, start); 
    if(where==npos) { 
    break; 
    } 
    original.replace(where, search_val.size(), replace_val); 
    start = where + replace_val.size(); 
} 
+0

cảm ơn câu trả lời của bạn –

1

Để so sánh ở đây là các chức năng trong C tinh khiết: http://www.pixelbeat.org/libs/string_replace.c

+1

Cụm từ "nội suy chuỗi" có nghĩa là gì? Tôi tìm thấy nó trong tiêu đề của liên kết mà bạn cung cấp. –

+0

Nếu bạn tra cứu "nội suy", bạn sẽ nhận được một mô tả. ví dụ: nội suy biến shell là quá trình thay thế $ name bằng "value". – pixelbeat

1

Một chút thanh lịch hơn:

void searchAndReplace(std::string& value, std::string const& search,std::string const& replace) { 
    for(std::string::size_type idx = value.find(search);match 
     idx != std::string::npos;   
     next = value.find(search, idx + replace.size()) 
    ) 
     value.replace(next, search.size(), replace); 
} 
0

Đơn giản ...

Nhưng giới hạn chỉ thay thế đơn char !!

#include <algorithm> 
string foo = "abc.e"; 
std::replace(foo.begin(), foo.end(),'.','d'); 

result --> foo = "abcde"; 
1
#include <boost/algorithm/string.hpp> 

string newstring = boost::replace_all_copy(original, search_val, replace_val); 

hoặc, nếu bạn muốn tại chỗ thay thế

boost::replace_all(original, search_val, replace_val); 
0

này có thể dẫn đến một thực hiện nhanh hơn và bảo tồn bản gốc nếu muốn.

static std::string strreplace(const std::string &original, const std::string &pattern, const std::string &newtext) { 
std::stringstream ss;   
std::string::size_type last = 0; 
std::string::size_type it = original.find(pattern, last); 
while(it != original.npos) { 
    if(it-last > 0) { 
     ss << original.substr(last, it - last); 
     ss << newtext; 
    } 
    last = it + pattern.size();     
    it = original.find(pattern, last); 
} 
return ss.str(); 

}

0

Đây có lẽ là phiên bản tập trung hầu hết các bạn của chuỗi thay thế:

for (string::size_type index = 0 ; 
         (index = value.find(from, index)) != string::npos ; 
         index += to.size()) 
    value.replace(index, from.size(), to); 
0

Một kiểm tra mã với các ví dụ.

Nếu bạn muốn chuỗi trở lại sử dụng này:

std::string ReplaceString(std::string subject, const std::string& search, 
          const std::string& replace) { 
    size_t pos = 0; 
    while ((pos = subject.find(search, pos)) != std::string::npos) { 
     subject.replace(pos, search.length(), replace); 
     pos += replace.length(); 
    } 
    return subject; 
} 

Nếu bạn cần thực hiện, đây là một chức năng tối ưu hóa mà sửa đổi chuỗi đầu vào, nó không tạo ra một bản sao của chuỗi:

void ReplaceStringInPlace(std::string& subject, const std::string& search, 
          const std::string& replace) { 
    size_t pos = 0; 
    while ((pos = subject.find(search, pos)) != std::string::npos) { 
     subject.replace(pos, search.length(), replace); 
     pos += replace.length(); 
    } 
} 

Các xét nghiệm:

std::string input = "abc abc def"; 
std::cout << "Input string: " << input << std::endl; 

std::cout << "ReplaceString() return value: " 
      << ReplaceString(input, "bc", "!!") << std::endl; 
std::cout << "ReplaceString() input string not changed: " 
      << input << std::endl; 

ReplaceStringInPlace(input, "bc", "??"); 
std::cout << "ReplaceStringInPlace() input string modified: " 
      << input << std::endl; 

Output:

Input string: abc abc def 
ReplaceString() return value: a!! a!! def 
ReplaceString() input string not modified: abc abc def 
ReplaceStringInPlace() input string modified: a?? a?? def 
Các vấn đề liên quan