Qt5 QRegExp如何替换双引号字符串内部的空格而不改动其余内容
Qt 5使用QRegExp替换双引号内空格的实现方案
问题分析
你当前编写的代码存在两个问题:
- 正则
\"(.+)\"是贪婪匹配,当字符串中存在多对双引号时会跨引号匹配,不符合预期 - 直接将整个匹配到的带引号片段替换为下划线,没有只修改片段内部的空格
解决方案
你可以参照JavaScript方案的逻辑:先匹配所有双引号包裹的片段,再逐个替换片段内部的空格后写回原字符串,示例代码如下:
#include <QRegExp> #include <QDebug> int main() { QString str = "text a b c text \"text text1 text2\" text d e f"; // 正则匹配双引号包裹的所有内容,[^\"]规则确保不会跨引号匹配 QRegExp quoteReg("\"[^\"]*\""); int matchPos = 0; while ((matchPos = quoteReg.indexIn(str, matchPos)) != -1) { // 获取当前匹配到的完整带引号内容 QString matchContent = quoteReg.cap(0); // 仅替换匹配内容内部的空格为下划线 QString processed = matchContent.replace(' ', '_'); // 替换回原字符串 str.replace(matchPos, matchContent.length(), processed); // 移动指针跳过已处理的片段,避免重复匹配 matchPos += processed.length(); } qDebug() << str; // 输出结果:"text a b c text \"text_text1_text2\" text d e f" }
补充说明
如果你的项目使用Qt 5.1及以上版本,也可以改用QRegularExpression的lambda替换重载,写法更简洁,但上述QRegExp的实现方案兼容所有Qt 5版本,符合你的需求。
内容的提问来源于stack exchange,提问作者Dion
相关产品推荐
相关产品推荐

