2

这个问题有点混乱,所以我将用一个例子来解释。我没有特别使用任何语言。

我有以下字符串:

0,1,"foo","蓝色,黄色,红色",27

我需要创建一个由这些逗号分隔的值组成的数组,但如您所见,第四项(索引 3)是一个带引号的字符串,其中还包含逗号。

我需要将该字符串作为一个值,引号完整,如下所示:

[0, 1, "foo", "blue,yellow,red", 27]

在逗号上拆分对我没有帮助,因为它也会拆分字符串项。我将如何将这个逗号分隔的字符串解析到项目列表中。

4

3 回答 3

7

我不知道您的目标是什么语言,但一般的方法是一次读取一个字符,像往常一样以逗号分隔。但是,如果您遇到 a"作为新项目的第一个字符,则设置一个标志(如in_quotes)。如果设置了该标志,您将读取所有字符,直到下一个",此时您将标志设置为 false。

于 2013-06-05T02:11:40.177 回答
2

我建议使用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 );
}
于 2013-06-05T02:10:25.640 回答
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
于 2013-06-05T02:17:02.220 回答