2011-07-14 18 views
0

以下のコードで何が間違っているか教えてください。下記のプログラムを使用してCSVファイルを解析しようとしていますが、m_uNumGroupsフィールドに0が返されます。CSVファイルを解析するためのATLの正規表現

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を正規表現で解析することは、すべての問題のために不可能ではないにしても、困難です。 StackOverflowをcsv regexに検索し、代わりにCSVパーサーを使用する必要があることを確認してください。
0

ATL正規表現の構文では、あなたがキャッチしている式を中括弧で囲む必要があります。あなたの表現には何も付いていないので、あなたはsbu-expressionsなしでちょうどマッチをしています。 http://msdn.microsoft.com/en-us/library/k3zs4axe%28v=vs.80%29.aspx

{} マッチグループを示す:このアウト

チェック。カッコ内の式に一致する入力内の実際のテキストは、CAtlREMatchContextオブジェクトを通じて取得できます。

関連する問題