boost :: regex,match_results :: operator [] - 神秘的“sub + = 2”行

时间:2013-10-13 22:53:02

标签: c++ regex boost boost-regex

我在访问boost :: match_results类的子匹配时遇到问题。 当我在调试器中检查程序时,match_results :: m_subs数组包含我期望的内容:

  • [0]完全匹配。
  • [1]还有子匹配。它们完全符合预期。

然而,当我尝试使用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

1 个答案:

答案 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'suffixprefix方法的实施方式:

   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。你不是疯子(以上只是非常可怕的代码)