簡體   English   中英

Perl正則表達式刪除字符串中的換行符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM