ATL正则表达式解析csv文件

ATL regex to parse csv files

本文关键字:csv 文件 正则表达式 ATL      更新时间:2023-10-16

有人能告诉我下面的代码有什么问题吗,我试图使用下面的程序解析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;;
}

使用ATL正则表达式语法,您需要在捕获的表达式周围使用花括号。你的表达式没有任何表达式,所以你只是在做match,而不使用双表达式。

看看这个:http://msdn.microsoft.com/en-us/library/k3zs4axe%28v=vs.80%29.aspx

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

我不懂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解析器。