Именованная захваченная подстрока в pcre ++ - PullRequest
1 голос
/ 17 июня 2010

Я хочу захватить именованную подстроку с помощью библиотеки 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 Ответ

0 голосов
/ 18 июня 2010

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

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

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

Извините за слишком ранний запрос.

...