C++ 正则表达式示例
源码位置: samples/libraries/cpp/regex 查看源码
功能说明
演示 C++ 标准库中正则表达式的使用,包括模式匹配、字符串搜索和分组提取等功能。本示例展示了如何使用 std::regex 进行文本处理和模式识别。
硬件连接
无需外部连接,正则表达式为软件功能,不依赖硬件资源。
示例内容
基本模式匹配(
regex_search)锚点匹配(
^开头、$结尾)字符类和量词匹配
分组提取和捕获
多次匹配和迭代搜索
编译
重要提示:编译前需要先确认当前示例支持的目标板型,然后将板型标识传给 -DBOARD。请按以下方式选择:
确认示例限制:查看当前示例
README中的硬件连接和注意事项,确认是否限定板型。参考示例配置:查看相关示例目录下的
sample.yaml,确认支持的板型。填写板型标识:SDK 内置板型的标识为
boards/下的目录名。例如实际使用的板型目录为boards/<板型名称>/,则编译参数填写为-DBOARD=<板型名称>。
在 SDK 根目录执行编译,并将命令中的 <示例路径> 和 <板型名称> 替换为实际值。
Linux 使用 build.sh:
# 通用命令
./build.sh -C -S samples/<示例路径> -DBOARD=<板型名称>
# 示例:使用 arcs_evb 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_evb
Windows PowerShell 使用 build.ps1:
# 通用命令
.\build.ps1 -C -S samples/<示例路径> -DBOARD=<板型名称>
# 示例:使用 arcs_evb 开发板
.\build.ps1 -C -S samples/<示例路径> -DBOARD=arcs_evb
Note
确保已安装对应平台的工具链和 ListenAI 开发工具包。Windows 环境请先执行 .\env.ps1 或直接使用 .\build.ps1 自动加载环境。
注意事项:-DBOARD 填写的是板型标识,不是芯片系列名称。如果示例有板型专用配置或额外编译参数,以示例 README 中的说明为准。
烧录固件
编译完成后,使用 SDK tools/burn 目录下的 cskburn 工具烧录固件。请先根据目标板型和当前示例确定芯片系列、串口设备、烧录地址和固件路径。
Linux:
# 通用命令
./tools/burn/cskburn -C <芯片系列> -s <串口设备> -b 3000000 <烧录地址> <固件路径>
# 示例:使用 arcs_evb 开发板
./tools/burn/cskburn -s /dev/ttyUSB0 -b 3000000 0x0 build/arcs.bin -C arcs
Windows PowerShell:
# 通用命令
.\tools\burn\cskburn.exe -C <芯片系列> -s <串口号> -b 3000000 <烧录地址> <固件路径>
# 示例:使用 arcs_evb 开发板
.\tools\burn\cskburn.exe -C arcs -s COM7 -b 3000000 0x0 .\build\arcs.bin
Note
烧录参数说明:
-s /dev/ttyUSB0/-s COM7:串口设备路径,需要根据实际情况修改 - Linux 系统:通常是/dev/ttyUSB0或/dev/ttyACM0- 可通过ls /dev/tty*命令查看可用串口设备 - Windows 系统:通常是COM7、COM8等,可在“设备管理器”的“端口”中查看 - 不同开发板或 USB 转串口芯片可能使用不同的设备名-b 3000000:烧录波特率(3Mbps)0x0:烧录起始地址build/arcs.bin/.\build\arcs.bin:编译生成的固件路径-C arcs:芯片类型
注意事项:
确保开发板已正确连接到电脑
如果无法识别串口设备,请检查 USB 连接线是否正常,或尝试其他 USB 端口
预期输出
=== C++ Regex Sample ===
1. Basic pattern matching:
Match: 'quick' in 'The quick brown fox'
Match: '^The' in 'The quick brown fox'
Match: 'fox$' in 'The quick brown fox'
Match: '\s[a-z]{5}\s' in 'The quick brown fox'
2. Extracting matches with groups:
Pattern: '([a-z]+)\s+([a-z]+)'
String: 'hello world'
Match 0: hello world
Match 1: hello
Match 2: world
Pattern: '(\d{4})-(\d{2})-(\d{2})'
String: 'Date: 2023-05-26'
Match 0: 2023-05-26
Match 1: 2023
Match 2: 05
Match 3: 26
Pattern: '([a-zA-Z]+) (\d+), (\d+)'
String: 'May 26, 2023'
Match 0: May 26, 2023
Match 1: May
Match 2: 26
Match 3: 2023
Regex Sample Completed
核心 API
API |
说明 |
|---|---|
|
正则表达式对象,用于存储编译后的模式 |
|
在字符串中搜索匹配的模式 |
|
匹配结果容器,存储匹配的子串 |
|
检查整个字符串是否完全匹配模式 |
关键代码
// 基本模式匹配
void match_pattern(const string& pattern, const string& str) {
regex re(pattern);
if (regex_search(str, re)) {
cout << "Match: '" << pattern << "' in '" << str << "'" << endl;
} else {
cout << "No match: '" << pattern << "' in '" << str << "'" << endl;
}
}
// 提取匹配和分组
void extract_matches(const string& pattern, const string& str) {
regex re(pattern);
smatch matches;
cout << "Pattern: '" << pattern << "'" << endl;
cout << "String: '" << str << "'" << endl;
string::const_iterator searchStart(str.cbegin());
int i = 0;
while (regex_search(searchStart, str.cend(), matches, re)) {
for (size_t j = 0; j < matches.size(); ++j) {
cout << "Match " << i << ": " << matches[j].str() << endl;
i++;
}
searchStart = matches[0].second;
}
}
// 使用示例
match_pattern("quick", "The quick brown fox");
extract_matches("([a-z]+)\\s+([a-z]+)", "hello world");
正则表达式语法
常用元字符
元字符 |
说明 |
|---|---|
|
匹配任意字符(除换行符) |
|
匹配字符串开头 |
|
匹配字符串结尾 |
|
匹配前一个字符 0 次或多次 |
|
匹配前一个字符 1 次或多次 |
|
匹配前一个字符 0 次或 1 次 |
|
匹配前一个字符恰好 n 次 |
|
匹配前一个字符 n 到 m 次 |
|
匹配字符类中的任意字符 |
|
匹配数字字符 |
|
匹配空白字符 |
|
捕获分组 |
转义字符
在 C++ 字符串中,反斜杠需要转义,因此正则表达式中的 \d 应写作 "\\d"。
注意事项
转义字符: 在 C++ 字符串字面量中,反斜杠需要转义,正则表达式
\d应写作"\\d"性能考虑:
std::regex对象可以重复使用,避免在循环中重复构造异常处理: 无效的正则表达式模式会抛出
std::regex_error异常匹配结果:
smatch[0]包含完整匹配,smatch[1]、smatch[2]等包含捕获的分组迭代器: 使用迭代器进行多次匹配时,需要更新搜索起始位置(
matches[0].second)大小写敏感: 默认情况下正则表达式区分大小写,如需忽略大小写可使用
std::regex_constants::icase标志