2010-06-17 72 views
1

我想捕獲具有pcre ++庫的命名子串。在pcre ++中命名捕獲的子串++

我知道pcre庫有這個功能,但是pcre ++沒有實現這個。

這是我現在有(只是一個簡單的例子):

pcrepp::Pcre regex("test (?P<groupName>bla)"); 

if (regex.search("test bla")) 
{ 
    // Get matched group by name 
    int pos = pcre_get_stringnumber(
     regex.get_pcre(), 
     "groupName" 
    ); 
    if (pos == PCRE_ERROR_NOSUBSTRING) return; 

    // Get match 
    std::string temp = regex[pos - 1]; 

    std::cout << "temp: " << temp << "\n"; 
} 

如果我調試,POS機返回1,這是正確的,(?PBLA)是1號子匹配(0是整個比賽)。應該沒問題。但是... regex.matches()返回0.爲什麼是這樣的:S?

Btw。我做正則表達式[pos - 1],因爲pcre ++將結果重新索引0,指向第一個子匹配,所以1.因此1變爲0,2變爲1,3變爲2等。

有沒有人知道如何解決這個問題?

+1

這聽起來像pcre ++比它的價值更麻煩:不完整的庫,在〜6yrs沒有發佈,操作符重載過度,重新定義了子匹配索引... ...直接下載或下載谷歌的RE2(http:// code。 google.com/p/re2/) – Stephen 2010-06-17 00:47:24

回答

0

我的錯誤不幸的是,我在我的真實程序中測試了正則表達式,那裏的正則表達式是不同的。我使用的是這樣的:

(?:/(?P<controller>[^/]+)(?:/(?P<action>[^/]+))?)? 

所以組名數轉換順利,但是當我試圖訪問組,我得到因的範圍指數(?:...)?組。我只是添加了一個檢查,如果組索引我在正確的範圍內,這是我可以使用該組。

對不起,這裏太早問它。