2012-11-26 73 views
0

我很努力地在匹配字符串之前插入一个换行符,该换行符由一个由2或3个字符(字母数字)开头并以另一个句点结尾的句点组成。如果可能的话,这需要作用于整个文件的单个语句。Perl正则表达式在模式匹配之前全局插入换行符

喜欢的东西(?):

$contents =~ s/\.{2,3}\./\n\.<what goes here?>\./g; 

具体来说,我处理在2步处理的许多目录记录文件。 第1步:删除文件中的所有回车。 第2步:查找文本字符串,如.AUTH。和.RE。甚至.856。并使每一个这些都成为新行的开始。我可以用很长的一系列具体换人为此,

$contents=~s/\.RE\./\n\.RE\./g; 
$contents=~s/\.AUTH\./\n\.AUTH\./g; 
$contents=~s/\.TITL\./\n\.TITL\./g; 

但我的理解是,我还可以用一个语句做到这一点更有效(使用内置变量的正则表达式?)

谢谢,

托姆

+2

的'.'字符没有在替换字符串进行转义。 –

回答

-1
$contents =~ s/(\.\w{2,3}\.)/\n$1/; 

使用圆括号记住匹配的字符串和$ 1引用它替代一部分。

+1

该解决方案执行您所要求的操作:“在匹配字符串前插入一个换行符,该字符串由一个句点,后跟2或3个字符(字母数字)并以另一个句点结束”,因此我不理解否定的投票。如果你更喜欢其他解决方案是好的,但至少不要负面投票。 –

1

要删除所有新行字符使用

$contents =~ s/\n//g; 

要添加所需的新行字符使用

$contents =~ s/(?=[.][a-z\d]{2,3}[.])/\n/ig; 
+0

这对数字没有问题,但对信件没有任何作用。换句话说,.856。字符串之前是换行符,而不是.AUTH。线。 –

+0

@ThomasShepard - 确定它不适用于'.AUTH.',因为您被要求输入2-3个字母数字字符串,而'AUTH'有4个字符。简单的数学,对吧?那么谁错了?如果你最多需要4个字符,那么把'{2,3}'换成'{2,4}',你应该好好去... –

+1

哎呀,是我的脸红!当然,你是正确的,是的,它现在工作。非常感谢! –