从字符串中提取前50个单词(Perl)

时间:2014-08-22 16:04:52

标签: perl split

我用Perl写作。

我需要将一个字符串分成前50个单词(如果总共少于50个单词,则为整个文本),其余单词(如果第一个单词不超过50个单词,则为空字符串)。

在第一部分(前50个单词)和第二部分(其余部分)中,应保留单词分隔符:换行符应保留换行符,空格应保留为空格。

2 个答案:

答案 0 :(得分:5)

假设 word 只表示一系列非空格字符,可以使用单个正则表达式完成。下面的一个查找N-1个连续的非空白字符序列,后跟空格字符,然后是另一段非空白字符。这是字符串的第一部分。跳过任何后面的空格,然后字符串的其余部分形成第二部分。

我使用了/s修饰符,以便正则表达式中的点.匹配任何字符,包括换行符。 /x修饰符允许正则表达式中的无效空格使其更具可读性。

感谢@knarf获取数据。

use strict;
use warnings;

my $text = 'Lorem ipsum dolor sit amet, consectetuer adipiscing
elit. Donec hendrerit tempor tellus. Donec pretium posuere
tellus. Proin quam nisl, tincidunt et, mattis eget, convallis nec,
purus. Cum sociis natoque penatibus et magnis dis parturient montes,
nascetur ridiculus mus. Nulla posuere. Donec vitae dolor. Nullam
tristique diam non turpis. Cras placerat accumsan nulla. Nullam
rutrum. Nam vestibulum accumsan nisl.';

my ($first, $rest) = wsplit($text, 50);

print $first, "\n\n";
print $rest, "\n";

sub wsplit {
  my ($s, $n) = @_;
  --$n;
  $s =~ / ( (?: \S+ \s+ ){0,$n} \S+ ) \s* (.*) /xs;
}

<强>输出

Lorem ipsum dolor sit amet, consectetuer adipiscing
elit. Donec hendrerit tempor tellus. Donec pretium posuere
tellus. Proin quam nisl, tincidunt et, mattis eget, convallis nec,
purus. Cum sociis natoque penatibus et magnis dis parturient montes,
nascetur ridiculus mus. Nulla posuere. Donec vitae dolor. Nullam
tristique diam non turpis. Cras placerat

accumsan nulla. Nullam
rutrum. Nam vestibulum accumsan nisl.

答案 1 :(得分:4)

我想出了这种天真的方式,但我想使用单一的正则表达式会更好。

use strict;
use warnings;
use Data::Dumper;

my $text = 'Lorem ipsum dolor sit amet, consectetuer adipiscing
elit. Donec hendrerit tempor tellus. Donec pretium posuere
tellus. Proin quam nisl, tincidunt et, mattis eget, convallis nec,
purus. Cum sociis natoque penatibus et magnis dis parturient montes,
nascetur ridiculus mus. Nulla posuere. Donec vitae dolor. Nullam
tristique diam non turpis. Cras placerat accumsan nulla. Nullam
rutrum. Nam vestibulum accumsan nisl.';

sub wsplit {
    my ($s, $words) = @_;

    my $pos = length $s;
    my $n = 0;
    while ($s =~ /\S+/g) {
        $n++;
        if ($n == $words) {
            $pos = pos $s;
            last;
        }
    }
    return [substr($s, 0, $pos), substr($s, $pos)]
}


print Dumper(wsplit($text, 8));

输出:

$VAR1 = [
          'Lorem ipsum dolor sit amet, consectetuer adipiscing
elit.',
          ' Donec hendrerit tempor tellus. Donec pretium posuere
tellus. Proin quam nisl, tincidunt et, mattis eget, convallis nec,
purus. Cum sociis natoque penatibus et magnis dis parturient montes,
nascetur ridiculus mus. Nulla posuere. Donec vitae dolor. Nullam
tristique diam non turpis. Cras placerat accumsan nulla. Nullam
rutrum. Nam vestibulum accumsan nisl.'
        ];