我有以下代码行,它用于将长句子分成具有指定字符长度的片段,并且只能在字边界上打破:
print "$_\n" for grep substr($_, 0, 80), /(.{1,80}\b)/g;
如果它适用于以下行:
所谓的smartguns已经投入使用多年,但却没有 获得了很大的吸引力。
它不会打印'。'字牵引后。我该怎么办才能修复它?感谢
答案 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;