boost::regex, match_results::operator[] - Загадочная строка "sub += 2"

У меня есть проблема с доступом к под-матчам из класса 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], но в коде везде есть это странное смещение.

Пожалуйста, скажи мне, что я не сумасшедший:)

Проверенные версии Boost: 1.54 и 1.53

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], $1 в m_subs[3] и т. Д., На которые можно ссылаться через класс match_results через [0], [1] и т. Д. Вот почему вы можете увидеть Волшебное число 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 с изложением вашей проблемы.

PS ты не ненормальный (выше просто ужасный код)

Другие вопросы по тегам