在KYLib 2.1.1.4 (build 2010.03.15) 中增加字符串替换函数 StringReplace, 源码如下: /* 头文件(.h) */ // 在 AStr 中查找 AOld 串, 并使用 ANew 替换 // 注: SameStr(AOld, ANew, true) 必须为 false, 内部不检查是否相同 // 如: StringReplace("aabbccddbbcc", "bc", "x", true) 返回值为: "aabxcddbxc" KYString StringReplace(const char* AStr, long ALength, const char* AOld, long AOldLen, const char* ANew, long ANewLen, bool AReplaceAll = false, bool ACaseSensitive = true); KYString StringReplace(const KYString& AStr, const char* AOld, long AOldLen, const char* ANew, long ANewLen, bool AReplaceAll = false, bool ACaseSensitive = true); inline KYString StringReplace(const KYString& AStr, const KYString& AOld, const KYString& ANew, bool AReplaceAll = false, bool ACaseSensitive = true) { return StringReplace(AStr, (char*)AOld, AOld.Length(), (char*)ANew, ANew.Length(), AReplaceAll, ACaseSensitive); } /* 源文件(.cpp) */ // 在 AStr 中查找 AOld 串, 并使用 ANew 替换 // 如: StringReplace("aabbccddbbcc", "bc", "x", true) 返回值为: "aabxcddbxc" // 注: 1. 若未找到 AOld 串则返回空串并 ANoFound == true, 否则 ANoFound == false; // 2. 参数 AStr, ALength, AOld, ALen 必须合法 // 3. SameStr(AOld, ANew, true) 必须为 false, 内部不检查是否相同 static KYString _DoStringReplace(const char* AStr, long ALength, const char* AOld, long AOldLen, const char* ANew, long ANewLen, bool AReplaceAll, bool ACaseSensitive, bool& ANoFound) { // 初始化 KYString result, strNext; int* pNext; long intPos; // 校正长度 if ((ANew == NULL) || (ANewLen < 0)) ANewLen = 0; // 分配缓冲区 strNext.SetLength(sizeof(int) * AOldLen); pNext = (int*)(char*)strNext; // 得到目标串的 KMP 的回溯表 GetKMPNext(AOld, AOldLen, pNext, ACaseSensitive); // 查找第一个匹配 ANoFound = false; intPos = _FindNext(AStr, ALength, AOld, AOldLen, pNext, 1, 1, ACaseSensitive) - 1; if (intPos < 0) ANoFound = true; else if (!AReplaceAll) { // 分配空间 result.SetLength(ALength + (ANewLen - AOldLen)); char* pPos = (char*)result; // 拷贝数据 if (pPos != NULL) { // 拷贝前半部 if (intPos > 0) { memcpy(pPos, AStr, intPos); pPos += intPos; } // 拷贝新串 if (ANewLen > 0) { memcpy(pPos, ANew, ANewLen); pPos += ANewLen; } // 拷贝后半部 intPos += AOldLen; ALength -= intPos; if (ALength > 0) { AStr += intPos; memcpy(pPos, AStr, ALength); } } } else { // 初始化 KYString strNew; char* pBegin; char* pPos; long intLen; // 计算最大尺寸 if (ANewLen <= AOldLen) intLen = ALength + (ANewLen - AOldLen); else if (AOldLen == 1) intLen = intPos + ANewLen * (ALength - intPos); else intLen = ALength + (ANewLen - AOldLen) * ((ALength - intPos) / AOldLen); // 分配缓冲区 strNew.SetLength(intLen); pBegin = (char*)strNew; pPos = pBegin; // 拷贝数据 if (pPos != NULL) { // 循环查找 do { // 拷贝前半部 if (intPos > 0) { memcpy(pPos, AStr, intPos); pPos += intPos; } // 拷贝新串 if (ANewLen > 0) { memcpy(pPos, ANew, ANewLen); pPos += ANewLen; } // 查找下一匹配项 intPos += AOldLen; AStr += intPos; ALength -= intPos; intPos = _FindNext(AStr, ALength, AOld, AOldLen, pNext, 1, 1, ACaseSensitive) - 1; } while (intPos >= 0); // 拷贝后半部 if (ALength > 0) { memcpy(pPos, AStr, ALength); pPos += ALength; } // 设置结果 result.SetString(pBegin, pPos - pBegin); } } // 返回结果 return result; } // 在 AStr 中查找 AOld 串, 并使用 ANew 替换 // 注: SameStr(AOld, ANew, true) 必须为 false, 内部不检查是否相同 // 如: StringReplace("aabbccddbbcc", "bc", "x", true) 返回值为: "aabxcddbxc" KYString StringReplace(const char* AStr, long ALength, const char* AOld, long AOldLen, const char* ANew, long ANewLen, bool AReplaceAll, bool ACaseSensitive) { // 初始化 KYString result; bool boolNoFound = true; // 检查参数 if ((AStr != NULL) && (AOld != NULL) && (AOldLen > 0) && (ALength >= AOldLen)) result = _DoStringReplace(AStr, ALength, AOld, AOldLen, ANew, ANewLen, AReplaceAll, ACaseSensitive, boolNoFound); // 若未找到则拷贝数据 if (boolNoFound) result.SetString(AStr, ALength); // 返回结果 return result; } // 在 AStr 中查找 AOld 串, 并使用 ANew 替换 // 注: SameStr(AOld, ANew, true) 必须为 false, 内部不检查是否相同 // 如: StringReplace("aabbccddbbcc", "bc", "x", true) 返回值为: "aabxcddbxc" KYString StringReplace(const KYString& AStr, const char* AOld, long AOldLen, const char* ANew, long ANewLen, bool AReplaceAll, bool ACaseSensitive) { // 初始化 KYString result; bool boolNoFound = true; // 检查参数 if ((AOld != NULL) && (AOldLen > 0) && (AStr.Length() >= AOldLen)) result = _DoStringReplace((char*)AStr, AStr.Length(), AOld, AOldLen, ANew, ANewLen, AReplaceAll, ACaseSensitive, boolNoFound); // 若未找到则拷贝数据 if (boolNoFound) result = AStr; // 返回结果 return result; }