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

2023-11-16

概述

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

“$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的思想),中文字符串中中文所占字符不是一。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 晶振电路中为什么用22pf或30pf

    让我们一起来看看到底晶振电路中为什么用22pf或30pf的电容而不用别的了 Y1是晶体 相当于三点式里面的电感 C1和C2就是电容 5404非门和R1实现一个NPN的三极管 接下来分析一下这个电路 5404必需要一个电阻 不然它处于饱和截止
  • js获取元素的距离父元素、窗口的距离offsetTop,offsetHeight,clientHeight

    前言 相信很多项目中都会有这样一个小需求 PC端 移动端则是点击 鼠标移上某个菜单或者某个位置 显示一个弹出框 移开则隐藏弹出框 就是css中hover效果 这种通常做法是每个子菜单下都有一个弹框 父元素相对定位 子元素绝对定位 只需要控制
  • 14、Qt 捕捉鼠标事件

    0 需求 在鼠标进入窗口实时捕捉所在位置 以及进行的操作 1 方法 我们主要使用QWidget中的几个方法 鼠标进入 void enterEvent QEvent event 鼠标离开 void leaveEvent QEvent even
  • 管理一年,领悟一生:迷茫、洞见与成长

    领导力跟你做了多少年管理 管过多少人 没有直接的关系 你开悟了 一年就能管得井井有条 不开悟 十年也是一塌糊涂 1 引言 大家好 我是苍何 相信作为技术人的成长路线大家都有了解吧 大家普遍所了解的就是两个路线 技术管理和架构师 而成为架构师
  • ue4大气纹理

    UE4的大气纹理 在 class FAtmosphereTextures public FRenderResource 成员变量上涉及到了辐射 投射 和散射 分三个部分 首先放入一个commandlist 然后分别就各参数创建RTT 传参数
  • python 中关于推导式生成器的一些总结

    推导式 可以理解为是数据生成方式或者是处理方式 类型 列表 元组 字符串 字典 集合 外部包装的括号决定了返回值类型的 定义 列表推导式 表达式 for循环 if语句 1 对列表中的每项元素进行立方运算 变换功能 a 1 2 3 4 5 6
  • 动态规划(1)

    动态规划 Dynamic Programming 是一种具有分治思想的迭代技术 它用于求解某些复杂的不包含决策过程的最优化问题 其基本思路是将原问题分解为子问题 并保存子问题的求解结果 从而避免不必要的重复计算 动态规划的主要思想就是将复杂
  • Java类、构造方法、对象

    public class Lader 定义类 float above 成员变量 类中有效 float bottom float height float area float area 4 合法 area 4 非法 在方法体中赋值 floa
  • 11月8日 改良射线,蓝图 UE4斯坦福 学习笔记

    修改射线类型 更改了昨天的射线类型 void USInteractionComponent PrimaryInteract 射线 FHitResult FHit 碰撞体 FCollisionObjectQueryParams ObjectQ
  • 为什么TCP建立连接需要三次握手

    TCP 协议是我们几乎每天都会接触到的网络协议 绝大多数网络连接的建立都是基于 TCP 协议的 学过计算机网络或者对 TCP 协议稍有了解的人都知道 使用 TCP 协议建立连接需要经过三次握手 three way handshake 如果让
  • 生鲜电商迎巨变?美菜撤出县城,有菜被集团关停

    生鲜B2B电商是个大生意 但也是个苦生意 随着生鲜从风口摔落 对 大 的渴望逐渐让位于对 苦 的体验 据 财经 报道 知名生鲜B2B平台美菜最近密集业务调整 半年来退出数百个县城和10个中心城市 急剧向平台模式转型 疫情带来的线下餐饮行业变
  • JAVA zip 压缩包 导出

    JAVA 导出 zip压缩文件 代码如下 public void downloading String orderId List
  • SSM之一步一坑:返回JSON格式 中文乱码问号 解决方案

    在使用SSM框架写代码时 偶然间在console控制台发现一个 text plain charset ISO 8859 1 这种数据格式 如下图 当时就感觉有点问题 因为我的项目中使用UTF 8的编码格式 并且在web xml 中也采用了u
  • ubuntu安装高版本python

    ubuntu安装高版本python 以python3 7为例 安装其他版本python更改安装包即可 使用wget拉取安装包的方式 单纯命令行容易报错 1 下载python安装包并解压 wget https www python org f
  • 空值的处理

    1 取空值的时机 1 1不知道取什么值 比如学生登记表 某个学生的年龄忘记填了 1 2不能取值 比如选了课 缺考了 所以成绩表的成绩填空 1 3由于某种原因不便填写 比如一个人的手机号码不便填写 2 空值的产生 2 1没有给属性列赋值 2
  • 数据结构学习(一)数据结构基础

    文章目录 算法与数据结构学习 一 数据结构基础 1 数据结构 1 1 什么是数据结构 1 2 学习数据结构的必要性 2 算法 2 1 怎么衡量算法的好坏 2 1 1 时间复杂度 2 1 2 空间复杂度 2 2 时间复杂度的计算 2 3 常见
  • 【unity】【jit】【游戏开发】讲解ios系统不支持JIT的来龙去脉,以及unity在IOS上需要使用反射时候的替代方案

    标题有点长啊 很彪 所以我们叫彪题 咋地 东北地 你瞅啥 1 带有增高垫IL的c c 语言作为一种高级语言 是不能直接在我们的CPU上来直接运行的 需要编译成IL语言 Intermediate Language 即中间层语言 就是这么高冷
  • 《机器学习实战》第六章 Python3代码-(亲自修改测试可成功运行)

    由于Peter Harrington所著的这本 机器学习实战 中的官方代码是Python2版本的且有一些勘误 使用Python3的朋友运行起来会有很多问题 所以我将自己在学习过程中修改好的Python3版本代码分享给大家 以供大家交流学习
  • STM32 bool

    STM32中基于库V3 5的头文件中 去掉了对bool类型变量的定义 而将它放在了文件stdbool h中 d Keil v5 ARM ARMCC include stdbool h stdbool文件内容如下 stdbool h ISO
  • C++将字符串中包含指定字符串范围内的字符串全部替换

    概述 将指定字符串所在的范围之内的字符串全部替换为指定的字符串 如 源字符串 START dfh待到花开月圆时 两首相顾心相连 END dhussd2434xhuhu是别人十大海归 转换后的字符串 dfh待到花开月圆时 两首相顾心相连 dh