如何在单词边界后打印字符

时间:2014-03-04 03:51:51

标签: regex perl

我有以下代码行,它用于将长句子分成具有指定字符长度的片段,并且只能在字边界上打破:

print "$_\n" for grep substr($_, 0, 80), /(.{1,80}\b)/g;

如果它适用于以下行:

  

所谓的smartguns已经投入使用多年,但却没有   获得了很大的吸引力。

它不会打印'。'字牵引后。我该怎么办才能修复它?感谢

3 个答案:

答案 0 :(得分:3)

正则表达式的目标,跨越80个或更少的字符,并以非空格结束。它应该后跟一个空格或一个字符串的结尾,然后我们应该吞噬任何后面的空格,以便下一行从一个字符开始。可以找到网络提供的说明here

while (<DATA>) {
    chomp(my $line = $_);

    print "$_\n" for $line =~ /(.{1,80})(?<=\S)(?=\s|$)\s*/g;
}

__DATA__
So-called smartguns have been in the works for years but haven't gotten much traction.

也可以依靠cpan Text::Wrap

答案 1 :(得分:1)

该行末尾的

'.'与您的正则表达式不匹配,因此表达式/(.{1,80}\b)/g不会返回它。

在我看来,你真正尝试做的事情就是在空格上划分界限。使用现有的正则表达式,您可以想象地分割收缩(例如haven\n't)或您未考虑的任何其他数量的角落案例。

也许

/(.{1,80}(?:\s|$))/g

会更好地满足您的需求。

答案 2 :(得分:1)

这应该这样做:

(.{1,80}\b[^a-zA-Z0-9])

示例:http://regex101.com/r/oQ3hX1

代码:

print "$_\n" for grep substr($_, 0, 80), /(.{1,80}\b[^a-zA-Z0-9])/g;