[c++] 부분 문자열을 다른 부분 문자열로 바꾸기 C ++

C ++에서 문자열의 하위 문자열을 다른 하위 문자열로 어떻게 바꿀 수 있습니까? 어떤 함수를 사용할 수 있습니까?

eg: string test = "abc def abc def";
test.replace("abc", "hij").replace("def", "klm"); //replace occurrence of abc and def with other substring



답변

이 작업을 수행하는 C ++에는 내장 함수가 없습니다. 한 부분 문자열의 모든 인스턴스를 다른 부분 문자열로 바꾸려면 string::find및에 대한 호출을 혼합하여 수행 할 수 있습니다 string::replace. 예를 들면 :

size_t index = 0;
while (true) {
     /* Locate the substring to replace. */
     index = str.find("abc", index);
     if (index == std::string::npos) break;

     /* Make the replacement. */
     str.replace(index, 3, "def");

     /* Advance index forward so the next iteration doesn't pick it up as well. */
     index += 3;
}

이 코드의 마지막 줄 index에서 문자열에 삽입 된 문자열의 길이만큼 증가 했습니다. 교체 -이 특정 예에서 "abc""def"-이 실제로 필요하지 않습니다. 그러나보다 일반적인 설정에서는 방금 교체 한 문자열을 건너 뛰는 것이 중요합니다. 교체 할 경우 예를 들어, "abc"함께 "abcabc"새로 교체 문자열 세그먼트를 스킵하지 않고, 메모리가 소진 될 때까지,이 코드는 지속적으로 새로 교체 문자열의 일부를 대체 할 것이다. 독립적으로 새 캐릭터를 건너 뛰는 것이 string::find함수의 시간과 노력을 절약하기 때문에 약간 더 빠를 수 있습니다 .

도움이 되었기를 바랍니다!


답변

부스트 문자열 알고리즘 라이브러리 방식 :

#include <boost/algorithm/string/replace.hpp>

{ // 1. 
  string test = "abc def abc def";
  boost::replace_all(test, "abc", "hij");
  boost::replace_all(test, "def", "klm");
}


{ // 2.
  string test = boost::replace_all_copy
  (  boost::replace_all_copy<string>("abc def abc def", "abc", "hij")
  ,  "def"
  ,  "klm"
  );
}


답변

, 다음을 사용할 수 있습니다 std::regex_replace.

#include <string>
#include <regex>

std::string test = "abc def abc def";
test = std::regex_replace(test, std::regex("def"), "klm");


답변

교체 할 문자열의 길이와 교체 할 문자열의 길이가 다르면 모든 솔루션이 실패 할 것이라고 생각합니다. ( “abc”를 검색하고 “xxxxxx”로 대체) 일반적인 접근 방식은 다음과 같습니다.

void replaceAll( string &s, const string &search, const string &replace ) {
    for( size_t pos = 0; ; pos += replace.length() ) {
        // Locate the substring to replace
        pos = s.find( search, pos );
        if( pos == string::npos ) break;
        // Replace by erasing and inserting
        s.erase( pos, search.length() );
        s.insert( pos, replace );
    }
}


답변

str.replace(str.find(str2),str2.length(),str3);

어디

  • str 기본 문자열입니다.
  • str2 찾을 하위 문자열입니다.
  • str3 대체 부분 문자열입니다.


답변

부분 문자열 교체는 그렇게 어렵지 않습니다.

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;
}

성능이 필요한 경우 다음은 입력 문자열을 수정하는 최적화 된 함수이며 문자열의 복사본을 생성하지 않습니다.

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();
    }
}

테스트 :

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;

산출:

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


답변

using std::string;

string string_replace( string src, string const& target, string const& repl)
{
    // handle error situations/trivial cases

    if (target.length() == 0) {
        // searching for a match to the empty string will result in 
        //  an infinite loop
        //  it might make sense to throw an exception for this case
        return src;
    }

    if (src.length() == 0) {
        return src;  // nothing to match against
    }

    size_t idx = 0;

    for (;;) {
        idx = src.find( target, idx);
        if (idx == string::npos)  break;

        src.replace( idx, target.length(), repl);
        idx += repl.length();
    }

    return src;
}

string클래스 의 멤버 가 아니기 때문에 예제 에서처럼 멋진 구문을 허용하지 않지만 다음은 동등한 작업을 수행합니다.

test = string_replace( string_replace( test, "abc", "hij"), "def", "klm")