ATL регулярное выражение для анализа CSV-файлов - PullRequest
0 голосов
/ 14 июля 2011

Может кто-нибудь сказать мне, что не так с приведенным ниже кодом, я пытаюсь проанализировать файлы CSV с помощью приведенной ниже программы, но в поле m_uNumGroups он возвращает ноль.

int _tmain(int argc, _TCHAR* argv[])
{
     CAtlRegExp<> reUrl;
    // Five match groups: scheme, authority, path, query, fragment
    REParseError status = reUrl.Parse(**L"[^\",]+|(?:[ˆ\"])|\"\")"**);

    if (REPARSE_ERROR_OK != status)
    {
        // Unexpected error.
        return 0;
    }

    TCHAR testing[ ] = L"It’ s \" 10 Grand\" , baby";

    CAtlREMatchContext<> mcUrl;
    if (!reUrl.Match(testing,&mcUrl))
    {
        // Unexpected error.
        return 0;
    }

    for (UINT nGroupIndex = 0; nGroupIndex < mcUrl.m_uNumGroups;nGroupIndex)
    {
        const CAtlREMatchContext<>::RECHAR* szStart = 0;
        const CAtlREMatchContext<>::RECHAR* szEnd = 0;
        mcUrl.GetMatch(nGroupIndex, &szStart, &szEnd);

        ptrdiff_t nLength = szEnd - szStart;
        printf_s("%d: \"%.*s\"\n", nGroupIndex, nLength, szStart);
    }

    return 0;;
}

Ответы [ 2 ]

0 голосов
/ 22 сентября 2011

С синтаксисом регулярных выражений ATL необходимо использовать фигурные скобки вокруг выражения, которое вы перехватываете. Ваше выражение не имеет, так что вы делаете просто соответствие без sbu-выражений.

Проверьте это: http://msdn.microsoft.com/en-us/library/k3zs4axe%28v=vs.80%29.aspx

{} Обозначает группу совпадений. Фактический текст во входных данных, который соответствует выражению внутри фигурных скобок, можно получить через объект CAtlREMatchContext.

0 голосов
/ 14 июля 2011

Я не знаю C ++, но если вы пытаетесь разобрать "It’ s \" 10 Grand\" , baby" в It’ s \" 10 Grand\" и baby, то это не получится по нескольким причинам:

  1. потому что эта строка не является допустимым синтаксисом CSV. В CSV кавычки внутри полей должны быть экранированы путем удвоения (ваши экранируются вообще, только на строковом уровне), а поля, содержащие кавычки, должны быть заключены в кавычки. Допустимая строка CSV будет "\"It’ s \"\" 10 Grand\"\"\", baby".
  2. потому что ваше регулярное выражение неверно. Разбор CSV с помощью регулярных выражений труден, если не невозможен, из-за всех вовлеченных ошибок. Найдите StackOverflow для csv regex и выясните, что вместо него следует использовать анализатор CSV.
...