1

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

  • [0] 是完全匹配。
  • [1] 更进一步的是子匹配。它们完全符合预期。

但是,当我尝试使用 operator[] 和从 1 开始的子匹配索引来访问子匹配时,我没有得到我想要的。原因隐藏在 boost 源码中:

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

4

1 回答 1

1

中定义的类的m_subs向量属性中的前两个元素保留用于存储前缀和后缀。它们的确切含义是:boost::match_resultsmatch_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] 中,$1 存储在 m_subs[3] 等中,可以通过 match_results 类通过 [0]、[1] 等来引用。这就是为什么你可以看到魔术数字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 。

PS你不是疯了(上面只是非常糟糕的代码)

于 2013-10-15T11:52:51.523 回答