regex 基础
匹配文本中的模式
regex 基础 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
什么是 <regex>
<regex> 头文件可以让您将文本与描述字符串集合的正则表达式模式进行匹配。您可以构建一个模式,然后使用它测试或搜索文本。
std::regex存储已编译的模式。- 匹配函数会报告文本是否符合模式。
#include <iostream>
#include <regex>
int main() {
std::regex pattern("hello");
std::cout << std::boolalpha << std::regex_match("hello", pattern) << '\n';
return 0;
}regex_match 与 regex_search
regex_match 要求整个字符串都匹配。只要模式出现在字符串的任何位置,regex_search 就会成功。
#include <iostream>
#include <regex>
int main() {
std::regex p("cat");
std::string s = "the cat sat";
std::cout << std::boolalpha;
std::cout << "match: " << std::regex_match(s, p) << '\n';
std::cout << "search: " << std::regex_search(s, p) << '\n';
return 0;
}字符类
方括号用于定义允许使用的字符集合。[aeiou] 可以匹配任意一个元音字母;[a-z] 这样的范围可以匹配小写字母。
#include <iostream>
#include <regex>
int main() {
std::regex p("[a-z]+");
std::cout << std::boolalpha << std::regex_match("hello", p) << '\n';
std::cout << std::regex_match("Hello", p) << '\n';
return 0;
}量词
量词控制重复次数:* 表示零次或多次,+ 表示一次或多次,? 表示可选,{n,m} 表示次数范围。
#include <iostream>
#include <regex>
int main() {
std::regex p("a+b");
std::cout << std::boolalpha;
std::cout << std::regex_match("aaab", p) << '\n';
std::cout << std::regex_match("b", p) << '\n';
return 0;
}预定义字符类
简写字符类可以减少输入:\\d 匹配一个数字,\\w 匹配一个单词字符,\\s 匹配空白字符。在 C++ 源代码中,反斜杠需要写成两个。
#include <iostream>
#include <regex>
int main() {
std::regex p("\\d+");
std::cout << std::boolalpha;
std::cout << std::regex_match("12345", p) << '\n';
std::cout << std::regex_match("12a45", p) << '\n';
return 0;
}定位符
定位符可以将匹配固定在某个位置:^ 表示文本开头,$ 表示文本结尾。它们匹配的是位置,而不是字符。
#include <iostream>
#include <regex>
int main() {
std::regex p("^abc$");
std::cout << std::boolalpha;
std::cout << std::regex_search("abc", p) << '\n';
std::cout << std::regex_search("xabc", p) << '\n';
return 0;
}交替匹配
竖线 | 表示“或”。模式 cat|dog 可以匹配其中任意一个单词。请使用圆括号进行分组,以限制其作用范围。
#include <iostream>
#include <regex>
int main() {
std::regex p("cat|dog");
std::cout << std::boolalpha;
std::cout << std::regex_match("cat", p) << '\n';
std::cout << std::regex_match("dog", p) << '\n';
std::cout << std::regex_match("fish", p) << '\n';
return 0;
}转义特殊字符
.、* 和 ( 等字符具有特殊含义。请使用反斜杠对它们进行转义,才能按字面匹配。
#include <iostream>
#include <regex>
int main() {
std::regex p("3\\.14");
std::cout << std::boolalpha;
std::cout << std::regex_match("3.14", p) << '\n';
std::cout << std::regex_match("3x14", p) << '\n';
return 0;
}不区分大小写的匹配
构造模式时传入 std::regex::icase 之类的标志,即可在匹配时忽略字母大小写。
#include <iostream>
#include <regex>
int main() {
std::regex p("hello", std::regex::icase);
std::cout << std::boolalpha;
std::cout << std::regex_match("HELLO", p) << '\n';
std::cout << std::regex_match("Hello", p) << '\n';
return 0;
}简单验证
模式非常适合验证输入格式,例如检查字符串是否符合带可选符号的基本数字形式。
#include <iostream>
#include <regex>
bool isNumber(const std::string& s) {
static const std::regex p("-?\\d+");
return std::regex_match(s, p);
}
int main() {
std::cout << std::boolalpha;
std::cout << isNumber("-42") << '\n';
std::cout << isNumber("4a2") << '\n';
return 0;
}多次匹配
组合字符类和量词,可以验证更丰富的格式,例如由一串字母后跟一串数字组成的内容。
#include <iostream>
#include <regex>
int main() {
std::regex p("[A-Za-z]+\\d+");
std::cout << std::boolalpha;
std::cout << std::regex_match("abc123", p) << '\n';
std::cout << std::regex_match("123abc", p) << '\n';
return 0;
}快速检查
请测试您对匹配和搜索区别的理解。
回顾
您已经学会了 <regex> 的基础知识:
- 使用
regex_match进行整字符串匹配,使用regex_search进行子字符串匹配 - 字符类、量词、定位符和交替匹配
- 使用
\\d之类的预定义字符类,以及转义特殊字符 - 使用
icase之类的标志
接下来,您将使用捕获组提取匹配结果中的特定部分。
常见问题解答
「regex 基础」课时是免费的吗?
是的 — 「regex 基础」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「regex 基础」这节课中我会学到什么?
匹配文本中的模式 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「regex 基础」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。