【问题标题】:Parsing a comma-delimited string that contains string items that contain commas解析一个逗号分隔的字符串,该字符串包含包含逗号的字符串项
【发布时间】:2013-05-31 14:13:31
【问题描述】:

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

我有以下字符串:

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

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

我需要将该字符串作为一个值,引号保持不变,如下所示:

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

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

【问题讨论】:

标签: string parsing


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我建议使用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 );
    }
    

    【讨论】:

      【解决方案3】:

      使用 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
      

      【讨论】:

        猜你喜欢
        • 2016-05-28
        • 1970-01-01
        • 1970-01-01
        • 2016-04-15
        • 2022-08-18
        • 1970-01-01
        • 1970-01-01
        • 2012-11-12
        • 1970-01-01
        相关资源
        最近更新 更多