ATL正则表达式解析csv文件

时间:2011-07-14 07:41:38

标签: c++ regex atl

有些人可以告诉我下面的代码有什么问题,我试图使用以下程序解析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 :(得分:0)

我不知道C ++,但是如果你试图将"It’ s \" 10 Grand\" , baby"解析为It’ s \" 10 Grand\"baby,那么这会因以下几个原因而失败:

  1. 因为该字符串不是有效的CSV语法。在CSV中,字段中的引号需要通过加倍来转义(您的转义根本不会转义,仅在字符串级别转义),包含引号的字段必须用引号括起来。有效的CSV字符串为"\"It’ s \"\" 10 Grand\"\"\", baby"
  2. 因为你的正则表达式是错误的。使用正则表达式解析CSV很难,如果不是不可能的话,因为所涉及的所有陷阱。搜索csv regex的StackOverflow并找出您应该使用CSV解析器。

答案 1 :(得分:0)

使用ATL正则表达式语法,您需要在要捕获的表达式周围使用大括号。你的表达式没有,所以你只是在没有sbu表达式的情况下进行匹配。

检查出来:http://msdn.microsoft.com/en-us/library/k3zs4axe%28v=vs.80%29.aspx

  

{}   表示匹配组。可以通过CAtlREMatchContext对象检索输入中与大括号内表达式匹配的实际文本。