Как извлечь отдельные символы или вложенные группы из строки в Perl? - PullRequest
2 голосов
/ 21 сентября 2009

Я хотел бы разбить строку: «Привет [Вы] Все»

в следующий массив:

H,e,l,l,o,[You],A,l,l

Я пытался сделать это с помощью split:

my $str = "Hello[You]All";
my @list = split(/(\[.*?\]|.)/, $str);

foreach (@list) {
    print "->$_\n";
}

Поскольку я пробовал что-то, что не должно делиться split, он дал мне следующий массив:

,H,,e,,l,,l,,o,,[You],,A,,l,,l,

Следующий шаг, который мне нужно сделать, это удалить пустые места.

Хотя это не самое лучшее решение, оно единственное, которое я нашел, без чего-либо слишком грязного. Я пишу здесь, чтобы спросить, знает ли кто-нибудь лучший способ решить эту задачу?

Ответы [ 3 ]

8 голосов
/ 21 сентября 2009
my $str = "Hello[You]All";
my @list = $str =~ /(\[.*?\]|.)/g;

foreach (@list) {
    print "->$_\n";
}

То есть: вам не нужно разбивать на шаблон, который вы используете (что приводит к тем пустым элементам, потому что это фактический текст, который был разделен с использованием вашего шаблона в качестве разделителя); вам просто нужно извлечь все совпадения для вашего шаблона. Что делает глобальное (/g) сопоставление с шаблоном в контексте массива.

5 голосов
/ 21 сентября 2009

Вы можете получить результаты для непустых элементов;

my @list = grep /./, split(/(\[.*?\]|.)/, $str);

В качестве альтернативы

my @list = $str =~ /\[.*?\]|./g;
1 голос
/ 22 сентября 2009

Хотя я также думаю, что ответ хаоса здесь правильный, для полноты, вот один из способов достижения того, что вы хотите, используя split и grep:

#!/usr/bin/perl

use strict;
use warnings;

my $x = "Hello[You]All";
my @x = grep { defined } split qr{(\[.+\])|}, $x;

use Data::Dumper;
print Dumper \@x;

Используя этот шаблон, split разделяется либо на символы в скобках (вы не упомянули, если "a[]b" является допустимым вводом), либо на пустую строку и фильтры grep на defined ness, а не на значение true.

...