[英]perl regex remove newlines in string
我有一個Perl腳本,該腳本在純文本文件中的數據庫轉儲上運行,當我看到引號之間的字符串時,嘗試刪除所有換行符實例以及其他可能的奇數字符:
INSERT INTO ... VALUES ( "... these are the lines I'm interested in." )
我住文件:
@file = <FILE>;
和:
foreach my $line (@file) {
$line =~ s/"[^"]*(\R)+[^"]*"//g;
# I want to get rid of newlines in strings
# And other odd characters I might come across
}
我使用的一個字符類代替(\\ R)是:
([\r\n\t\v\f]+)
我會嘗試:
$line =~ s/"[^"]+?([\r\n\t\v\f]+)[^"]*"//g;
我確定我想念什么。 我嘗試以文字雙引號開始匹配,掃描除雙引號以外的所有內容(非貪婪,至少一個匹配項),找到我要刪除的字符,並繼續掃描非雙引號(其他任意數量)字符而不是雙引號),直到到達結尾的雙引號為止。
因此,我想一無所有地替換上面的$ 1捕獲。
我已經嘗試過在線正則表達式構建器,並且
/"[^"]*?([\r\n\t\f\v]+)[^"]*"/
使用了在線測試,使用了帶有換行符和制表符的簡短段落,盡管它處於PHP pcre模式。 我以為它將與Perl一起使用。
也許我沒有為Perl在正則表達式中正確轉義某些字符? 否則該模式將無法按照我想要的方式工作,因為它是錯誤的。
謝謝您的任何幫助。
regex101.com上的正則表達式:
"[^"]*?([\r\n\f\t\v]+)[^"]*?"
匹配以下字符串:
“這是
我的測試
串。
在那里!”
我現在很困惑。 :)
真正的問題是,在引號之間可能有許多組時,您只會找到一組\\R
最好的辦法是使用雙引號之間的常規匹配進行回調(eval),然后將\\R
替換為
更換。
就像是:
sub repl {
my ($content) = _@;
$content =~ s/\R+//g;
return $content;
}
$input =~ s/"([^"]*)"/ repl($1) /ge;
編輯 :如果您只尋找1個換行群集,則必須
排除導致它的換行符。 例如: [^"\\r\\n]+
edit2:要將文件插入到$input
,請執行
$/ = undef;
my $input = <$fh>;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.