我用Perl写.
我需要将一个字符串分成前50个单词(如果总共少于50个单词,则为整个文本),其余单词(如果第一个单词不超过50个单词则为空字符串).
在第一部分(前50个单词)和第二部分(其余部分)中,应保留单词分隔符:换行符应保持换行符,空格应保留为空格.
假设通过单词表示只是一系列非空白字符,这可以简单地使用单个正则表达式完成.下面的一个查找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;
}
Run Code Online (Sandbox Code Playgroud)
产量
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.
Run Code Online (Sandbox Code Playgroud)