Regex Perl拆分逗号分隔的列表,带“;及;

Regex Perl拆分逗号分隔的列表,带“;及;,regex,perl,csv,split,Regex,Perl,Csv,Split,使用Perl,我想拆分逗号上的字符串和“and”(前面可能有逗号,也可能没有逗号) “苹果”提供数组(苹果) “苹果和橙色”给出数组(苹果橙色) “苹果、橙色和香蕉”给出数组(苹果、橙色和香蕉) 出于某种原因,以下拆分正则表达式不适用于我: split(/(,| and )/, $string) 试试这个: my @list = split /\s*(?:(?:,\s*)?\band\b|,)\s*/, $string; 例如: perl -E "say join ':', split /\

使用Perl,我想
拆分
逗号上的字符串和“and”(前面可能有逗号,也可能没有逗号)

  • “苹果”
    提供数组
    (苹果)
  • “苹果和橙色”
    给出数组
    (苹果橙色)
  • “苹果、橙色和香蕉”
    给出数组
    (苹果、橙色和香蕉)
  • 出于某种原因,以下拆分正则表达式不适用于我:

    split(/(,| and )/, $string)
    
    试试这个:

    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 |, /
    
    试试这个:

    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 |, /
    
    以下内容适用于您:

    split /(?: ,?\s*and\s* | ,\s+? )/x;
    
    以下内容适用于您:

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

    这里有一个解决方案。它依赖于两个
    拆分
    来完成所有繁重的工作,并带有一个
    地图
    ,以方便使用。它可能与其他答案没有太大区别,但它很干净,而且对眼睛来说相当容易(除了打印)。我认为它可以处理大多数关于空格/和/逗号的变化

    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
    

    这里有一个解决方案。它依赖于两个
    拆分
    来完成所有繁重的工作,并带有一个
    地图
    ,以方便使用。它可能与其他答案没有太大区别,但它很干净,而且对眼睛来说相当容易(除了打印)。我认为它可以处理大多数关于空格/和/逗号的变化

    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
    

    谢谢,效果很好。你能告诉我什么是
    (?:)
    匹配的吗?这是一个非捕获组。做普通组
    做的事情,但没有捕获内容。谢谢,效果很好。你能告诉我什么是
    (?:)
    匹配的吗?这是一个非捕获组。做普通组
    ()
    可以,但不捕获内容。