ATL正则表达式解析csv文件
ATL regex to parse csv files
有人能告诉我下面的代码有什么问题吗,我试图使用下面的程序解析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
,那么由于以下几个原因,这将失败:
- ,因为该字符串不是有效的CSV语法。在CSV中,字段中的引号需要用双引号转义(您的引号根本不转义,只在字符串级别转义),并且包含引号的字段必须用引号括起来。有效的CSV字符串应该是
""It’ s "" 10 Grand""", baby"
。 - 因为你的正则表达式是错误的。使用正则表达式解析CSV很难,如果不是不可能的话,因为涉及到所有的陷阱。在StackOverflow中搜索
csv regex
,发现你应该使用CSV解析器。
相关文章:
- 正在将csv文件读取为双精度矢量
- 如何选择在 csv 文件中输出的位置
- 有没有办法在不使用 getline() 的情况下从.csv文件中读取?
- 无法读取C++中的 CSV 文件
- 流:CSV 文件中的换行符
- 如何正确格式化csv文件?
- 正在分析CSV文件-C++
- 如何获取组件和搜索 CSV 文件
- C++ 中的 CSV 文件管理(特别是设置标头和每个标头将分别具有的值)
- 无法逐行读取.csv文件
- 非常快速地阅读 CSV 文件
- 该程序将.csv文件中的一系列单词放入数组中,然后随机生成句子.但它不起作用
- CSV文件之间的差异,使用getline()产生不同的结果
- 将 CSV 文件中的双倍值C++到矢量中
- C++ 将 CSV 文件的列写入向量
- 使用getline读取.csv文件时出现问题
- CSV文件未从缓冲区获取数据
- 错误的值是使用c++从CSV文件数据写入数组
- 将csv文件加载到MySQL C++中
- 读取C++中的大型CSV文件(~4GB)