我有一个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]+)[^"]*?"
匹配像这样的字符串:
“这是
我的测试
的字符串。
所以那里!“
我现在非常困惑。 :)
答案 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