我在访问boost :: match_results类的子匹配时遇到问题。 当我在调试器中检查程序时,match_results :: m_subs数组包含我期望的内容:
然而,当我尝试使用operator []访问子匹配和从1开始的子匹配索引时,我不能得到我想要的东西。原因隐藏在提升源中:
const_reference operator[](int sub) const
{
if(m_is_singular && m_subs.empty())
raise_logic_error();
sub += 2; //< WTF?
if(sub < (int)m_subs.size() && (sub >= 0))
{
return m_subs[sub];
}
return m_null;
}
我对此完全感到困惑。文档说我只是使用[n]访问第n个子匹配,但在代码中,到处都有这种奇怪的偏移。
请告诉我,我不是疯了:)
检查增强版本:1.54和1.53
答案 0 :(得分:1)
m_subs
中定义的boost::match_results
类的match_results.hpp
向量属性中的前两个元素保留用于存储前缀和后缀。它们的确切含义是:
m_subs[0] - suffix
m_subs[0].first - the end position of the match
m_subs[0].second - the end position of the input text
m_subs[0].matched - m_subs[0].first != m_subs[0].second
m_subs[1] - prefix
m_subs[1].first - the start position of the input text
m_subs[1].second - the start position of the match
m_subs[1].matched - m_subs[1].first != m_subs[1].second
捕获组$ 0的匹配位置存储在m_subs [2]中,m_subs [3]中的$ 1等,可以通过[0],[1]等通过match_results类引用。这就是为什么你可以看到在几个地方添加magic number 2。
了解match_results'suffix
和prefix
方法的实施方式:
const_reference prefix() const
{
if(m_is_singular)
raise_logic_error();
return (*this)[-1];
}
const_reference suffix() const
{
if(m_is_singular)
raise_logic_error();
return (*this)[-2];
}
由于这已经有一段时间了,我不会很快认为这会导致你的特殊问题。如果您需要更多帮助,请提出另一个问题,其中包含SSCCE概述您的问题。
P.S。你不是疯子(以上只是非常可怕的代码)