perl regex删除字符串中的换行符

时间:2015-11-10 15:39:52

标签: regex string perl replace

我有一个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]+)[^"]*?"

匹配像这样的字符串:

“这是

我的测试

的字符串。

所以那里!“

我现在非常困惑。 :)

1 个答案:

答案 0 :(得分:0)

真正的问题是,当引号之间可能有多个组时,您只能找到一组\R。最好的办法是使用引号之间的一般匹配进行回调(eval),然后替换\R中的sub repl { my ($content) = _@; $content =~ s/\R+//g; return $content; } $input =~ s/"([^"]*)"/ repl($1) /ge; 更换。

类似的东西:

[^"\r\n]+

修改:如果您只查找1个换行符群集,则必须 排除导致它的换行符。例如:$input

edit2:要将文件粘贴到$/ = undef; my $input = <$fh>; ,请执行

ng-if