如果用双引号括起来,我试图找到一个与分隔符不匹配的正则表达式。但它也必须能够处理具有单个双引号的值。我的第一部分是下面的表达式,其中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正则表达式引擎。如果有更多我可以提供的信息,请告诉我。我知道基于你的设置,正则表达式可能很挑剔,我希望我已经解释了我正在寻找的东西!
答案 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。尽管有分隔文本的标准