Perl 用 "and" 拆分逗号分隔的列表



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

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

由于某些原因,下面的拆分正则表达式不适合我:

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

试试这个:

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

的例子:

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

或者更简单的例子:

/,? and |, /
my $str = 'Apple, Orange, and Banana';
$str =~ s/,?s*andb/,/;
my @words = split /s*,s*/, $str;

以下split应该适合您:

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

这里有一个解决方案。它依靠两个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*ands*/, $str;
    @list = map { split /s*,s*/, $_ } @list;
    return @list;
}
输出:

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

最新更新