使用Perl,我想在逗号和"and"(前面可能有逗号,也可能没有逗号)上split
一个字符串。
-
"Apple"
给出数组(Apple)
-
"Apple and Orange"
给出数组(Apple Orange)
-
"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