Perl регулярное выражение вопрос - PullRequest
1 голос
/ 28 марта 2011

Я хотел бы использовать функцию разделения Perl в строках с разделителями-запятыми и захватывать только два или более слов между запятыми в массиве.Отдельные слова не нужны.

Например, эта строка - >> aaa, ccc ddd, eee, fff ggg uuu, я только хочу, ccc ddd and fff ggg uuu

while(<FH>)
{
   @ = split(/,/);  
}

Ответы [ 3 ]

1 голос
/ 28 марта 2011

демонстрационный скрипт:

my @data = (
     'aaa, ccc ddd, eee, fff ggg uuu'
   , ' aaa bbb ,ccc,eee,fff ggg uuu '
   , 'aaa,ccc,eee,fff'
);
for my $line (@data) {
  printf "|%s| ==> \n", $line;
  $line =~ s/^\s+|\s+$//g;
  my @cut = grep { / / } split( /\s*,\s*/, $line );
  printf "|%s|\n\n", join( '|', @cut );
}

выход:

|aaa, ccc ddd, eee, fff ggg uuu| ==>
|ccc ddd|fff ggg uuu|

| aaa bbb ,ccc,eee,fff ggg uuu | ==>
|aaa bbb|fff ggg uuu|

|aaa,ccc,eee,fff| ==>
||

менее кратко, чем решение Даллайлаена, но может упростить проверку / обработку особых случаев.

1 голос
/ 28 марта 2011

Это так же просто, как:

(undef, undef, @parsedvalues) = split /, /

Вы по сути выбрасываете первые два значения, которые вы получаете из split.

1 голос
/ 28 марта 2011

ОБНОВЛЕНИЕ: Добавлена ​​защита "aaa," и ",", также.

$line =~ s/^\s+|\s+$//g; # or you get false positives 
my @multiword = grep {/\s/} split /\s*,[,\s]*/, $line;

Разделение уничтожит все пространство вокруг запятых, поэтому все, что в массиве содержит пробел, состоит из нескольких слов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...