2013-10-13 78 views
1

訪問來自boost :: match_results類的子匹配時遇到問題。 當我在調試器檢查程序,一個match_results :: m_subs數組包含正是我期望:boost :: regex,match_results :: operator [] - 神祕的「sub + = 2」行

  • [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個submatch,但是在代碼中,這個奇怪的偏移量到處都是。

請告訴我,我不是瘋了:)

經過增壓版本:1.54和1.53

回答

1

match_results.hpp定義的boost::match_results類的m_subs向量屬性的前兩個元素被保留用於存儲前綴和後綴。其確切的含義是:

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]等,這就是爲什麼你可以看到在幾個地方添加了0​​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.你不是瘋了(以上是非常可怕的代碼)

+0

Phew!我的理智得救了! 我知道「謝謝」意見應該避免,但認真,謝謝! –

+0

不客氣 –