2014-03-04 58 views
2

我有以下的代码行,它被用来打破一个长句与指定的字符长度的片,并且可以在字边界只有突破:字边界后如何打印字符

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

如果适用于以下行:

所谓smartguns一直在工作多年,但还没有得到 多的牵引力。

它不会打印'。'在词牵引之后。我能做些什么来解决它?谢谢

回答

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

感谢您的解决方案,它完美的作品。我是Perl和正则表达式的新手,你能解释一下你提供的正则表达式吗? – photosynthesis

+0

我编辑了我的答案,提供了正则表达式的基本描述。对于正则表达式的详细分析,只是谷歌“[描述一个正则表达式](https://www.google.com/#q=describe+a+regular+expression)”,第一个结果往往是一个资源提供任何正则表达式的详细解析。 – Miller

1

'.'在该行正则表达式不匹配的结束,所以它不会被表达/(.{1,80}\b)/g返回。

在我看来,你是真的试图做的是分解线上的空间。利用你现有的正则表达式,你可以想象将收缩(例如haven\n't)或任何其他数量的你没有考虑过的角落情况。

也许

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

会满足您的需求更好。

+0

感谢您的解决方案,它完美的工作。我是Perl和正则表达式的新手,你能解释一下你提供的正则表达式吗? – photosynthesis

+0

'(?:...)'让我们在不创建捕获组的情况下使用圆括号。 '\ s'表示任何“空格”(包括制表符),'$'是一个与行尾相匹配的特殊字符。所以'\ s | $'意思是“匹配任何空格或行末' – mob

+0

对不起,我不太明白,你能帮忙解释为什么它可以在不截断单词的情况下制作一段长度有限的句子吗? – photosynthesis