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

时间:2016-02-25 17:42:51

标签: regex qt csv qregexp

如果用双引号括起来,我试图找到一个与分隔符不匹配的正则表达式。但它也必须能够处理具有单个双引号的值。我的第一部分是下面的表达式,其中DELIMITER几乎可以是任何东西,但主要是逗号,管道和双管道:

DELIMITER(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)

这会处理正确形成的CSV行apple, "banana, and orange", grape。我可以在分隔符上拆分并获取值:

['apple', 'banana, and orange', 'grape']

我的问题是我可能会遇到类似apple, "banana, and orange, grape的行。在这种情况下,我想获得值:

['apple', '"banana', 'and orange', 'grape']

但是,我得到了:

['apple, "banana', 'and orange', 'grape']

它基本上忽略了双引号之外的所有逗号。

我脑子里的逻辑是,如果前面有双引号,我想忽略逗号,但前提是它前面还有一个双引号。我的第一个想法就是玩一个后视镜,但由于后台无法处理量词,我无法让它工作(如果这是错误的,请纠正我)。

我正在使用Qt QRegExp,我理解它或多或少类似于Perl正则表达式引擎。如果有更多我可以提供的信息,请告诉我。我知道基于你的设置,正则表达式可能很挑剔,我希望我已经解释了我正在寻找的东西!

1 个答案:

答案 0 :(得分:0)

它不是QT,但是boost :: tokenizer(仅限标题)支持转义分隔文本格式。

来自Boost文档的示例用法:http://www.boost.org/doc/libs/1_60_0/libs/tokenizer/escaped_list_separator.htm

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

在格式错误的情况下,tok会返回一个令牌,这不是您正在寻找的内容。您正在寻找非标准的 1 解析,考虑编写一个小型状态机而不是正则表达式。

1。尽管有分隔文本的标准