【问题标题】:Perl split comma separated list with "and"Perl 用“and”分割逗号分隔列表
【发布时间】:2011-10-03 14:46:35
【问题描述】:

使用 Perl,我想 split 一个字符串上的逗号和“and”(前面可能有也可能没有逗号。

  1. "Apple" 给出数组 (Apple)
  2. "Apple and Orange" 给出数组 (Apple Orange)
  3. "Apple, Orange, and Banana" 给出数组 (Apple Orange Banana)

由于某种原因,以下拆分正则表达式不适用于我:

split(/(,| and )/, $string)

【问题讨论】:

    标签: regex perl csv split


    【解决方案1】:

    试试这个:

    my @list = split /\s*(?:(?:,\s*)?\band\b|,)\s*/, $string;
    

    例子:

    perl -E "say join ':', split /\s*(?:(?:,\s*)?\band\b|,)\s*/, 'apple, orange, and banana'"
    apple:orange:banana
    

    或者为您的示例提供一个更简单的工作案例:

    /,? and |, /
    

    【讨论】:

    • 谢谢,完美。你能告诉我(?: ) 匹配什么吗?
    • 这是一个非捕获组。与普通组 () 一样,但不捕获内容。
    【解决方案2】:
    my $str = 'Apple, Orange, and Banana';
    
    $str =~ s/,?\s*and\b/,/;
    my @words = split /\s*,\s*/, $str;
    

    【讨论】:

      【解决方案3】:

      以下split 应该适合您:

      split /(?: ,?\s*and\s* | ,\s+? )/x;
      

      【讨论】:

        【解决方案4】:

        这是一种解决方案。它依赖于两个split 完成所有繁重的工作,以及一个map 为方便起见。它可能与其他答案没有太大区别,但它很干净,而且在眼睛上相当容易(除了印刷品)。而且我认为它适用于空格/和/逗号的大多数变体。

        use warnings;
        use strict;
        
        my @w = ( "Apple", "Apple and Orange", "Apple, Orange, and Banana",
            "Apple, Orange and Banana ,and Pineapple" );
        
        for (@w) {
            print join (':', humanize($_)), "\n";
        }
        
        
        sub humanize {
            my $str = shift;
            my @list = split /\s*and\s*/, $str;
            @list = map { split /\s*,\s*/, $_ } @list;
            return @list;
        }
        

        输出:

        Apple
        Apple:Orange
        Apple:Orange:Banana
        Apple:Orange:Banana:Pineapple
        

        【讨论】:

          猜你喜欢
          • 2012-12-16
          • 1970-01-01
          • 2013-07-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多