2012-11-26 109 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

哎呀,是我的臉紅!當然,你是正確的,是的,它現在工作。非常感謝! –