解析以逗号分隔的字符串,其中包含包含逗号的字符串项

时间:2013-06-05 02:07:42

标签: string parsing

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

我有以下字符串:

  

0.1,为 “foo”, “蓝,黄,红”,27

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

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

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

分裂逗号不会帮助我,因为它也会拆分字符串项。我如何将这个以逗号分隔的字符串解析为项目列表。

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:1)

我建议使用逗号作为字段分隔符使用strtok。但是,如果字符串中的第一个字符是双引号,则应使用"作为字段分隔符。

如果我假设您展示的是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 );
}

答案 2 :(得分: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