C++正则表达式:获取子匹配的捕获组的索引
C++ regex: Get index of the Capture Group the SubMatch matched to
Context.我正在开发一个词法分析器/标记化引擎,它将使用正则表达式作为后端。词法分析器接受定义令牌类型/ID 的规则,例如
<identifier> = "\b\w+\b"
.
正如我所设想的那样,要进行基于正则表达式匹配的标记化,正则表达式定义的所有规则都包含在捕获组中,并且所有组都由 OR 分隔。
执行匹配时,我们生成的每个匹配都必须具有与其匹配的捕获组的索引。我们使用这些 ID 将匹配项映射到令牌类型。
所以这个问题的问题出现了——如何获取组的ID?
这里有类似的问题,但它没有为我的特定问题提供解决方案。
正是我的问题,但它在 JS 中,我需要一个 C/C++ 解决方案。
因此,假设我有一个正则表达式,由捕获由OR分隔的组组成:
(\b[a-zA-Z]+\b)|(\b\d+\b)
与整数或字母单词匹配。
我的问题要求可以知道正则表达式子匹配的捕获组的索引,例如在匹配字符串时
foo bar 123
将完成 3 次迭代。每次迭代的匹配的组索引将被0 0 1
,因为前两个匹配匹配第一个捕获组,最后一个匹配匹配第二个捕获组。
我知道在标准std::regex
库中这并不完全可行(regex_token_iterator
不是解决方案,因为我不需要跳过任何匹配)。
我对boost::regex
或 PCRE 正则表达式库知之
甚少。完成此任务的最佳方法是什么?使用哪个库和方法?
您可以使用sregex_iterator
获取所有匹配项,一旦有匹配项,您就可以分析std::match_results
结构,只获取参与匹配的组的 ID-1 值(注意这里只有一个组会匹配,要么是第一个,要么是第二个),可以用m[index].matched
方便地检查:
std::regex r(R"((b[[:alpha:]]+b)|(bd+b))");
std::string s = "foo bar 123";
for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r);
i != std::sregex_iterator();
++i)
{
std::smatch m = *i;
std::cout << "Match value: " << m.str() << " at Position " << m.position() << 'n';
for(auto index = 1; index < m.size(); ++index ){
if (m[index].matched) {
std::cout << "Capture group ID: " << index-1 << std::endl;
break;
}
}
}
请参阅C++演示。输出:
Match value: foo at Position 0
Capture group ID: 0
Match value: bar at Position 4
Capture group ID: 0
Match value: 123 at Position 8
Capture group ID: 1
请注意,R"(...)"
是原始字符串文本,无需在其中使用双反斜杠。
此外,index
设置为在for
循环开始时1
,因为第 0 组是整个匹配项,但您希望组 ID 从零开始,这就是稍后减去1
的原因。
- 使用正则表达式regex_search在字符串中查找字符串
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- C++正则表达式无限循环
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- 定义有趣的宏和正则表达式在Z3 C++绑定
- 带有多个字符分隔符的正则表达式
- C++ 使用增强正则表达式库时断言崩溃
- 有人可以帮助我处理正则表达式吗?
- 使用正则表达式获取大括号块的列表
- 正则表达式以匹配数字的重复模式,后跟任何类型的分隔符?
- 组合正则表达式部分使用 | 不起作用的 C++
- 为什么C++正则表达式这么慢?
- 如何使HTML5电子邮件验证正则表达式在C++中工作?
- 在C++中实现正则表达式
- 如何根据某个索引将字符串与正则表达式匹配?
- C++正则表达式:获取子匹配的捕获组的索引
- 索引处C++正则表达式
- 使用正则表达式查找第一个匹配C++索引
- 用于解析c++中数组索引表达式的正则表达式
- 如何在与提升正则表达式匹配的字符串中找到索引