这个问题有点混乱,所以我将用一个例子来解释。我没有特别使用任何语言。
我有以下字符串:
0,1,"foo","蓝色,黄色,红色",27
我需要创建一个由这些逗号分隔的值组成的数组,但如您所见,第四项(索引 3)是一个带引号的字符串,其中还包含逗号。
我需要将该字符串作为一个值,引号完整,如下所示:
[0, 1, "foo", "blue,yellow,red", 27]
在逗号上拆分对我没有帮助,因为它也会拆分字符串项。我将如何将这个逗号分隔的字符串解析到项目列表中。
我不知道您的目标是什么语言,但一般的方法是一次读取一个字符,像往常一样以逗号分隔。但是,如果您遇到 a"
作为新项目的第一个字符,则设置一个标志(如in_quotes
)。如果设置了该标志,您将读取所有字符,直到下一个"
,此时您将标志设置为 false。
我建议使用strtok
逗号作为字段分隔符。但是,如果字符串中的第一个字符是双引号,则应"
用作字段分隔符。
如果我假设你显示的是 a struct
,我用 C 语言编写代码以在单独的行上打印输出:
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "0,1,\"foo\",\"blue,yellow,red\",27";
printf ( "Input string: %s\n", str );
char * substr;
char * str_itr = str;
char comma[] = ",";
char quote[] = "\"";
substr = strtok ( str_itr, comma );
if ( substr )
printf ( "%s\n", substr );
substr = strtok ( NULL, comma );
if ( substr )
printf ( "%s\n", substr );
substr = strtok ( NULL, quote );
if ( substr )
printf ( "%s\n", substr );
substr = strtok ( NULL, quote );
substr = strtok ( NULL, quote );
if ( substr )
printf ( "%s\n", substr );
substr = strtok ( NULL, comma );
if ( substr )
printf ( "%s\n", substr );
return ( 0 );
}
使用 Perl:
my $s = '0,1,"foo","blue,yellow,red",27';
my @l = grep {defined $_} split(/("[^"]*")|,/, $s);
print join("-" , @l), "\n";
输出:
0-1--"foo"---"blue,yellow,red"--27