2010-06-17 3 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"; 
} 

Если я отладка, позы возврат 1, и это правильно, (? PBLA) является 1th submatch (0 целого совпадение). Это должно быть хорошо. Но ... regex.matches() return 0. Почему это: S?

КПП. Я использую regex [pos-1], потому что pcre ++ переиндексирует результат с 0, указывающим на первый подкачка, поэтому 1. Таким образом, 1 становится 0, 2 становится 1, 3 становится 2 и т. Д.

Кто-нибудь знает, как исправить это ?

+1

Похоже, что pcre ++ больше проблем, чем того стоит: неполная библиотека, без релизов в ~ 6yrs, неудобная перегрузка оператора, хромое переопределение индексирования отправки ... Идите прямо с pcre или загрузите RE2 (http: // код Google). google.com/p/re2/) – Stephen

ответ

0

Моя ошибка, к сожалению, я проверил регулярное выражение в моей реальной программе, и там регулярное выражение было другим. Я что-то вроде этого:

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

Таким образом, название группы для преобразования номера идет хорошо, но когда я пытаюсь получить доступ к группе я получаю индекс диапазона из-за (?: ...)? групп. Я просто добавил проверку, если индекс группы i в правильном диапазоне, я могу использовать группу.

Извините, что попросил его здесь слишком рано.