Regex 用于处理格式错误的分隔文件的正则表达式

Regex 用于处理格式错误的分隔文件的正则表达式,regex,qt,csv,qregexp,Regex,Qt,Csv,Qregexp,我试图找到一个正则表达式,如果它用双引号括起来,它将与分隔符不匹配。但它还必须能够处理具有单双引号的值。第一部分是下面的表达式,DELIMITER可以是除逗号、管道和双管道以外的任何形式: DELIMITER(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$) 这将处理格式正确的CSV行,如苹果、香蕉和橘子、葡萄。我可以拆分分隔符并获取值: ['apple', 'banana, and orange', 'grape'] 我的问题是,我可能会遇到像苹果、香蕉、橘子、葡萄这样的行。

我试图找到一个正则表达式,如果它用双引号括起来,它将与分隔符不匹配。但它还必须能够处理具有单双引号的值。第一部分是下面的表达式,
DELIMITER
可以是除逗号、管道和双管道以外的任何形式:

DELIMITER(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)
这将处理格式正确的CSV行,如苹果、香蕉和橘子、葡萄。我可以拆分分隔符并获取值:

['apple', 'banana, and orange', 'grape']
我的问题是,我可能会遇到像苹果、香蕉、橘子、葡萄这样的行。在这种情况下,我希望得到以下值:

['apple', '"banana', 'and orange', 'grape']
然而,我得到:

['apple, "banana', 'and orange', 'grape']
它基本上忽略了直到双引号的所有逗号

我脑子里的逻辑是,如果逗号前面有双引号,我想忽略它,但前提是它前面也有双引号。我的第一个想法是在后面看一看,但我无法做到这一点,因为后面看无法处理量词(如果这是错误的,请纠正我)


我正在使用Qt QRegExp,据我所知,它或多或少类似于Perl regex引擎。如果我能提供更多信息,请告诉我。我知道根据您的设置,正则表达式可能会很挑剔,我希望我已经充分解释了我要找的东西!

这不是Qt,而是boost::tokenizer,它只是标题,支持转义分隔文本格式

根据Boost文档中的示例用法:

//简单的\u示例\u 2.cpp
#包括
#包括
#包括
int main(){
使用名称空间std;
使用名称空间boost;
string s=“字段1,\”在字段周围加引号,允许逗号\”,字段3”;
标记器tok(s);
for(标记器::迭代器beg=tok.begin();beg!=tok.end();++beg){

cout它不是QT,而是boost::tokenizer,它只支持头,支持转义分隔文本格式

根据Boost文档中的示例用法:

//简单的\u示例\u 2.cpp
#包括
#包括
#包括
int main(){
使用名称空间std;
使用名称空间boost;
string s=“字段1,\”在字段周围加引号,允许逗号\”,字段3”;
标记器tok(s);
for(标记器::迭代器beg=tok.begin();beg!=tok.end();++beg){

我不能提供boost。我不确定这是否适用于格式错误的示例。苹果、香蕉和橘子、葡萄的输出是什么。我希望香蕉前面的双引号按字面理解,因此当它被放入数据库时,它是
“香蕉
。我没有可用的boost。我不确定这是否适用于格式错误的示例。苹果、香蕉、橘子、葡萄
的输出是什么。我希望香蕉前面的双引号按字面意思取,因此当它被放入数据库时,它是
”香蕉
。在苹果、“香蕉、橘子、葡萄”、“桃子、樱桃、柠檬”的情况下,你会寻找什么?为什么不根据不匹配的引用进行验证,并让用户修复他们的输入?我希望它会返回
[“香蕉、橘子、葡萄”、“桃子、樱桃、柠檬”]
我倾向于跳过这一行,让上游系统知道坏数据,但现在我只是想看看这是否可能。要么这篇文章会死,要么有人会让我知道目前只使用正则表达式是不可能的,要么这个问题会产生一个很棒的表达式!你会是什么在苹果的例子中寻找“香蕉、橘子、葡萄”、“桃子、樱桃、柠檬”?为什么不根据不匹配的引用进行验证并让用户修复他们的输入?我希望它会返回
[“香蕉、橘子、葡萄”、“桃、樱桃、柠檬”]
我倾向于跳过这一行,让上游系统知道坏数据,但现在我只是想看看这是否可能。要么这篇文章会死,要么有人会让我知道目前只使用正则表达式是不可能的,要么这个问题会产生一个很棒的表达式!
// simple_example_2.cpp
#include<iostream>
#include<boost/tokenizer.hpp>
#include<string>

int main(){
   using namespace std;
   using namespace boost;
   string s = "Field 1,\"putting quotes around fields, allows commas\",Field 3";
   tokenizer<escaped_list_separator<char> > tok(s);
   for(tokenizer<escaped_list_separator<char> >::iterator beg=tok.begin(); beg!=tok.end();++beg){
       cout << *beg << "\n";
   }
}