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 ты не ненормальный (выше просто ужасный код)