Список разделенных запятыми в Perl с "и" - PullRequest
1 голос
/ 12 июля 2011

Используя Perl, я бы хотел split строку на запятой и "и" (которой может предшествовать запятая или нет).

  1. "Apple" дает массив (Apple)
  2. "Apple and Orange" дает массив (Apple Orange)
  3. "Apple, Orange, and Banana" дает массив (Apple Orange Banana)

По некоторым причинам следующее разделенное регулярное выражение у меня не работает:

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

Ответы [ 4 ]

3 голосов
/ 12 июля 2011

Попробуйте это:

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 |, /
1 голос
/ 12 июля 2011

Вот одно из решений.Он полагается на двух 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
1 голос
/ 12 июля 2011

Следующее split должно работать для вас:

split /(?: ,?\s*and\s* | ,\s+? )/x;
1 голос
/ 12 июля 2011
my $str = 'Apple, Orange, and Banana';

$str =~ s/,?\s*and\b/,/;
my @words = split /\s*,\s*/, $str;
...