2011-07-14 30 views
0

有人可以告訴我什麼是錯誤的下面的代碼,我試圖解析CSV文件使用下面的程序,但它在m_uNumGroups字段返回零。ATL正則表達式來解析csv文件

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;; 
} 

回答

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解析器代替。
0

使用ATL正則表達式語法,您需要在捕捉的表達式周圍使用大括號。你的表情沒有任何表達,所以你沒有使用sbu-expressions就可以匹配。

檢查了這一點:http://msdn.microsoft.com/en-us/library/k3zs4axe%28v=vs.80%29.aspx

{} 指示匹配組。可以通過CAtlREMatchContext對象檢索與大括號內的表達式匹配的輸入中的實際文本。