0Pricing
C++ Academy · 课时

搜索与替换

使用正则表达式转换文本

搜索与替换 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。

regex_replace

std::regex_replace 会返回一个新字符串,其中模式的每个匹配结果都被替换字符串替代。

  • 原字符串保持不变。
  • 默认情况下,所有匹配结果都会被替换。
#include <iostream>
#include <regex>

int main() {
    std::regex p("cat");
    std::string s = "the cat and the cat";
    std::cout << std::regex_replace(s, p, "dog") << '\n';
    return 0;
}

替换数字

使用模式可以轻松进行批量编辑,例如用占位符屏蔽字符串中的每个数字。

#include <iostream>
#include <regex>

int main() {
    std::regex p("\\d");
    std::string s = "PIN 1234";
    std::cout << std::regex_replace(s, p, "*") << '\n';
    return 0;
}

替换字符串中的反向引用

在替换字符串中使用 $1、$2 等插入捕获组,从而重新排列文本。

#include <iostream>
#include <regex>

int main() {
    std::regex p("(\\w+) (\\w+)");
    std::string s = "John Smith";
    std::cout << std::regex_replace(s, p, "$2 $1") << '\n';
    return 0;
}

完整匹配:$&

标记 $& 表示完整匹配结果,适合用于在找到的文本两侧添加额外字符。

#include <iostream>
#include <regex>

int main() {
    std::regex p("\\d+");
    std::string s = "item 42";
    std::cout << std::regex_replace(s, p, "[$&]") << '\n';
    return 0;
}

仅替换第一个匹配结果

传入 std::regex_constants::format_first_only,即可只替换第一个匹配结果,而不是每次出现的位置。

#include <iostream>
#include <regex>

int main() {
    std::regex p("o");
    std::string s = "foo boo";
    auto out = std::regex_replace(s, p, "0", std::regex_constants::format_first_only);
    std::cout << out << '\n';
    return 0;
}

规范化空白字符

一种常见的清理任务是:将连续的空白字符合并为一个空格。

#include <iostream>
#include <regex>

int main() {
    std::regex p("\\s+");
    std::string s = "too    many     spaces";
    std::cout << std::regex_replace(s, p, " ") << '\n';
    return 0;
}

移除匹配结果

替换为空字符串实际上会删除每个匹配结果,适合用于去除不需要的字符。

#include <iostream>
#include <regex>

int main() {
    std::regex p("[^a-zA-Z]");
    std::string s = "a1b2c3";
    std::cout << std::regex_replace(s, p, "") << '\n';
    return 0;
}

重新格式化日期

捕获日期的各个部分,然后在替换内容中重新排列它们,即可更改日期格式。

#include <iostream>
#include <regex>

int main() {
    std::regex p("(\\d{4})-(\\d{2})-(\\d{2})");
    std::string s = "2026-05-30";
    std::cout << std::regex_replace(s, p, "$3/$2/$1") << '\n';
    return 0;
}

保留未匹配的文本

默认情况下,未匹配的文本会原样复制。使用 format_no_copy 可以只输出替换结果并丢弃其余内容。

#include <iostream>
#include <regex>

int main() {
    std::regex p("\\d+");
    std::string s = "a1b2c3";
    auto out = std::regex_replace(s, p, "$&", std::regex_constants::format_no_copy);
    std::cout << out << '\n';
    return 0;
}

屏蔽词语

将交替匹配与替换结合起来,即可一次屏蔽一组词语。

#include <iostream>
#include <regex>

int main() {
    std::regex p("bad|evil");
    std::string s = "a bad and evil idea";
    std::cout << std::regex_replace(s, p, "***") << '\n';
    return 0;
}

逐步构建结果

由于 regex_replace 会返回字符串,因此您可以将一个结果传入下一次调用,以串联多个转换操作。

#include <iostream>
#include <regex>

int main() {
    std::string s = "  Hello,   World  ";
    s = std::regex_replace(s, std::regex("\\s+"), " ");
    s = std::regex_replace(s, std::regex("^ | $"), "");
    std::cout << "[" << s << "]\n";
    return 0;
}

快速检查

请测试您对替换语法的理解。

回顾

您已经学会了使用 regex_replace 转换文本:

  • 默认替换所有匹配结果,并返回一个新字符串
  • $1、$2、$& 用于插入捕获组和完整匹配结果
  • 使用 format_first_only 和 format_no_copy 等标志
  • 串联调用以构建复杂的清理操作

接下来,您将学习如何高效使用正则表达式,并避免常见的性能陷阱。

常见问题解答

「搜索与替换」课时是免费的吗?

是的 — 「搜索与替换」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。

「搜索与替换」这节课中我会学到什么?

使用正则表达式转换文本 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C++ Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「搜索与替换」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C++ Academy 课中编写并运行代码吗?

能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. regex 基础
  2. 捕获组
  3. 搜索与替换
  4. 性能说明
← 返回 C++ Academy