C++将字符串中包含指定字符串范围内的字符串全部替换

这篇具有很好参考价值的文章主要介绍了C++将字符串中包含指定字符串范围内的字符串全部替换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

将指定字符串所在的范围之内的字符串全部替换为指定的字符串。如:
源字符串:

“$START$dfh待到花开月圆时,两首相顾心相连。$END$dhussd2434xhuhu是别人十大海归。”

转换后的字符串:

“dfh待到花开月圆时,两首相顾心相连。dhussd2434xhuhu是别人十大海归。”

或者转换为:

“dhussd2434xhuhu是别人十大海归。”

本文就是记录一种将上述字符串替换成功的方法。其中转换之后的第一个字符串,实际上是将原有字符串中“$START$”“$END$”替换为“”(空字符串);第二个是将原有字符串中的“$START$”“$END$”范围内的字符串替换为“”

实现代码

void replaceDynamicString(
    const std::string &startStr, const std::string &endStr,
    const std::string &replacedStr,std::string &info, int start)
{
    int startPos = info.find(startStr, start);
    int endPos = info.find(endStr, start);

    bool toBeReplace = false;
    if (std::string::npos != startPos && std::string::npos != endPos &&
        startPos < endPos)
    {
        toBeReplace = true;
        int startStrSize = startStr.size();
        int endStrSize = endStr.size();
        std::string subKeyStr = info.substr(startPos + startStrSize,
                                            endPos - startStrSize - startPos);
        if (subKeyStr.size() != 0)
        {
            info.replace(startPos, endPos + endStrSize - startPos, replacedStr);
            start = startPos + replacedStr.size();
        }
        else
            start = endPos + endStrSize;
    }

    if (toBeReplace)
        replaceDynamicString(startStr, endStr, replacedStr, info,start);
}

参数讲解

const std::string &startStr //替换字符串的开始位置,本例中是“$START$”
const std::string &endStr //替换字符串的结束位置,本例中是“$END$”
const std::string &replacedStr //替换为replacedStr 字符串,本例中是“”
std::string &info //源字符串
int start //开始查找的位置,本例中为0

函数调用

调用一

QString strStart = "$PLAQUE_START$";
QString strEnd = "$PALQUE_END$";
QString strSourceMsg = "$START$dfh待到花开月圆时,两首相顾心相连。$END$dhussd2434xhuhu是别人十大海归。";
std::string strTempMsg = strSourceMsg.toStdString();
replaceDynamicString(strStart.toStdString(),
                         strEnd.toStdString(), "",
                         strTempMsg, 0);

调用的结果

调用结束后,字符串strTempMsg的结果为:
dhussd2434xhuhu是别人十大海归。

调用二

QString strStart = "$PLAQUE_START$";
QString strEnd = "$PALQUE_END$";
QString strSourceMsg = "$START$dfh待到花开月圆时,两首相顾心相连。$END$dhussd2434xhuhu是别人十大海归。";

strSourceMsg.replace(strStart , "").replace(strEnd , "");

调用结果

调用结束后,字符串strSourceMsg的结果为:
dfh待到花开月圆时,两首相顾心相连。dhussd2434xhuhu是别人十大海归。

注意

上述调用示例,要是想替换完字符串之后,源字符串依旧保持不变,需要将源字符串在替换之前先暂存,替换结束之后,再次赋给源字符串变量。

调用三

将源字符串"dhus胡但凡撒地方, S T A R T START STARTdfh待到花开月圆时,两首相顾心相连。 E N D END ENDdhussd2434xhuhu是别人十大海归。"改为“dhus胡但凡撒地方。dhussd2434xhuhu是别人十大海归。”
针对于上述需求,就需要将上面的替换函数中添加逗号的替换为句号的代码。改变之后的替换函数如下:

void ReportManager::replaceDynamicString(const std::string &startStr,
                                         const std::string &endStr,
                                         const std::string &replacedStr,
                                         std::string &info, int start)
{
    int startPos = info.find(startStr, start);
    int endPos = info.find(endStr, start);

    bool toBeReplace = false;
    if (std::string::npos != startPos && std::string::npos != endPos &&
        startPos < endPos)
    {
        toBeReplace = true;
        int startStrSize = startStr.size();
        int endStrSize = endStr.size();
        std::string subKeyStr = info.substr(startPos + startStrSize,
                                            endPos - startStrSize - startPos);
        if (subKeyStr.size() != 0)
        {
            info.replace(startPos, endPos + endStrSize - startPos, replacedStr);
            // after replace "$xxxx$" contain description msg,if prevoius pos is
            // ",",replace to be "."
            LOG_INFO("--->startPos:", info[startPos]);
            LOG_INFO("--->startPos + 1:", info[startPos + 1]);
            LOG_INFO("--->startPos - 2:", info[startPos - 2]);
            LOG_INFO("--->startPos-1", info[startPos - 1]);
            LOG_INFO("--->BEFORE CHARATER:", info[startPos - 1], "info:", info);
            // char c = m_translate.strCommas.toStdString();
            /* std::string str = info.substr(startPos-1,1);
            LOG_INFO("--->str:",str);*/
            if (info.rfind(",", startPos) != string::npos ||
                info.rfind(",", startPos) !=
                    string::npos)  // m_translate.strCommas.toStdString())//','
            {
                int nPos = 0;
                esApp->getAppConfig()->getIsChinese() // 判断是否为中文,esApp->getAppConfig()->getIsChinese(),这句代码是当时项目上的,不能照搬,明白大意即可
                    ? nPos = info.rfind(",", startPos)
                    : nPos = info.rfind(",", startPos);
                info.replace(nPos, startPos - nPos,
                             m_translate.strPeriod.toStdString());//这句将逗号替换为句号,因为引入了qt的多语言,m_translate.strPeriod代表句号,此句也不能照搬,理解大意即可
            }
            start = startPos + replacedStr.size();
        }
        else
            start = endPos + endStrSize;
    }

    if (toBeReplace)
        replaceDynamicString(startStr, endStr, replacedStr, info, start);
}

上述替换函数改动的部分,实际上实现的是将被开始替换标识符前的逗号,改为句号。加入了判断是中文还是英文逗号。
经过上述的改动之后,替换函数replaceDynamicString的调用如下:

QString strStart = "$PLAQUE_START$";
QString strEnd = "$PALQUE_END$";
QString strSourceMsg = "dhus胡但凡撒地方,$START$dfh待到花开月圆时,两首相顾心相连。$END$dhussd2434xhuhu是别人十大海归。";
std::string strTempMsg = strSourceMsg.toStdString();
replaceDynamicString(strStart.toStdString(),
                         strEnd.toStdString(), "",
                         strTempMsg, 0);

调用结果

调用结束后,字符串strTempMsg的结果为:
dhus胡但凡撒地方,dhussd2434xhuhu是别人十大海归。

注意

如果字符串也是可以被翻译的,也就是引入了qt的多语言,那么针对于这种多语言字符串中的标点符号替换,就得利用多语言的思想来进行判断,不能直接利用偏移,(即标点符号的下一个位置-1的思想),中文字符串中中文所占字符不是一。文章来源地址https://www.toymoban.com/news/detail-467307.html

到了这里,关于C++将字符串中包含指定字符串范围内的字符串全部替换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c++ 字符串去除指定的字符

    使用 std::string 的 erase 和 find 方法 循环查找并擦除特定字符,逐个字符地搜索并移除字符 使用 std::remove 算法和 erase std::remove 函数可以用来移除指定的字符,并返回一个新的“逻辑”结束位置。实际的字符串内容没有改变,但所有需要保留的字符已经被移动到字符串的开始位

    2024年03月17日
    浏览(36)
  • 截取一个字符串里括号内的内容

    截取一个字符串里括号内的内容并输出(括号不会嵌套,只需要找到第一对括号即可) 示例: 示例1: hello,(world) 输出:world 示例2:system.crash(error: 100) and will done 输出:error: 100 Pattern pattern = Pattern.compile(“(?=()[^)]+”);是获取所有小括号里面的内容 输出结果:

    2024年02月11日
    浏览(24)
  • 【华为OD机考 统一考试机试C卷】构成指定长度字符串的个数( C++ Java JavaScript python)

    2023年11月份,华为官方已经将 华为OD机考:OD统一考试(A卷 / B卷)切换到 OD统一考试(C卷)和 OD统一考试(D卷) 。 真题目录:华为OD机考机试 真题目录(C卷 + D卷 + B卷 + A卷) + 考点说明 专栏:2023华为OD机试( B卷+C卷+D卷)(C++JavaJSPy) 华为OD面试真题精选:华为OD面试真题精

    2024年02月05日
    浏览(40)
  • 递归--打印一个字符串的全部排列(java)

    自负串全排序: 举例: abc 的全排序是: abc acb bac bca cba cab 因为每个字符都要选,其实就是选择每个字符的顺序,那我们递归时,就可以把不同顺序一直递归下去. 代码演示 解题思路: 我们可以按上面的代码去做,只需要用HashSet 去保存答案,就会去重了,但这样并没有优化效率,在递归时

    2024年02月06日
    浏览(33)
  • 【leetcode 力扣刷题】字符串翻转合集(全部反转///部分反转)

    题目链接:344. 反转字符串 题目内容: 题目中重点强调了必须 原地修改 输入数组,即不能新建一个数组来完成字符串的反转。我们注意到: 原来下标为0的,反转后是size - 1【原来下标是size - 1的,反转后是0】; 原来下标是1的,反转后是size - 2【原来下标是size -2的,反转后

    2024年02月11日
    浏览(29)
  • js删除字符串中的指定字符串

    `replace()` 将字符串中的指定子字符串替换为新的字符串。         如果删除指定的子字符串,可以将它替换为空字符串。 删除str中的“World”,结果为:   2.1 删除字符串中的所有匹配的子字符串 删除str中所有的“Hello”,结果为: 2.2 删除字符串中的第一个匹配的子字符

    2024年02月10日
    浏览(29)
  • Golang字符串处理深入解析:探索 strings 标准库的全部方法

    Golang 的 strings 标准库提供了许多用于处理字符串的函数。以下是一些主要的方法: Contains(s, substr string) bool : 检查字符串是否包含子串。 ContainsAny(s, chars string) bool : 检查字符串是否包含字符集中的任何字符。 ContainsRune(s string, r rune) bool : 检查字符串是否包含指定的符文。 C

    2024年02月12日
    浏览(22)
  • Java替换字符串最后指定字符

    需求感想省略...... 代码如下: public static void main(String[] args) { 测试案例1:         String str = \\\"|1|2|3||||||||||||||\\\";  //偶位数 测试案例2:         String str = \\\"|1|2|3|||||||||||\\\";   //奇数位 --------------------------------------------------------------------------------------------------------------------

    2024年02月12日
    浏览(29)
  • excel 获取指定字符前后的字符串

    目录 excel 获取指定字符前后的字符串 1.截取指定字符前的字符串 2.截取指定字符后的字符串 1.1LEFT +FIND  find:返回一个字符串在另一个字符串中出现的起始位置。 (区分大小写,且不允许使用通配符) 1.2 LEFT+SEARCH search:返回一个指定字符或文本字符串在字符串中第一次出现的位

    2024年02月07日
    浏览(32)
  • vue字符串替换,vue将字符串内指定字符替换,vue字符串替换函数.replace如何使用

    vue字符串替换,vue将字符串内指定字符替换,vue字符串替换函数.replace如何使用

    2024年02月11日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包