Regex perl正则表达式删除字符串中的换行符
我有一个Perl脚本,它在纯文本文件中的数据库转储上运行,当我看到引号之间的字符串时,试图删除所有换行符实例和其他可能的奇数字符:Regex perl正则表达式删除字符串中的换行符,regex,string,perl,replace,Regex,String,Perl,Replace,我有一个Perl脚本,它在纯文本文件中的数据库转储上运行,当我看到引号之间的字符串时,试图删除所有换行符实例和其他可能的奇数字符: INSERT INTO ... VALUES ( "... these are the lines I'm interested in." ) 我在文件中咕哝道: @file = <FILE>; 我使用的一个字符类代替(\R)是: 我会尝试: $line =~ s/"[^"]+?([\r\n\t\v\f]+)[^"]*"//g; 我肯定我错过了什么
INSERT INTO ... VALUES ( "... these are the lines I'm interested in." )
我在文件中咕哝道:
@file = <FILE>;
我使用的一个字符类代替(\R)是:
我会尝试:
$line =~ s/"[^"]+?([\r\n\t\v\f]+)[^"]*"//g;
我肯定我错过了什么。我试着开始用一个双引号匹配,扫描任何不是双引号的字符(非贪婪,至少一个匹配),找到我想要删除的字符,并继续扫描非双引号(任何数量的其他字符不是双引号),直到我找到结尾的双引号
所以我想把上面的1美元捕获替换为零
我尝试过在线正则表达式生成器,并且
/"[^"]*?([\r\n\t\f\v]+)[^"]*"/
使用了一个在线测试,使用了一个包含换行符和制表符的短段落,尽管它是在PHP pcre模式下。我认为它可以与Perl一起工作
也许我没有在Perl的正则表达式中正确转义一些字符?或者这个模式不会按我希望的方式运行,因为它是错误的
谢谢你,谢谢你的帮助
位于regex101.com的regex:
"[^"]*?([\r\n\f\t\v]+)[^"]*?"
匹配如下字符串:
“这是
我的\t测试
绳子
就这样!”
我现在完全糊涂了 真正的问题是,当引号之间可能有许多组时,您只能找到一组
\R
。最好的方法是使用引号之间的一般匹配进行回调(eval),然后替换中的
\R
替代品
比如:
sub repl {
my ($content) = _@;
$content =~ s/\R+//g;
return $content;
}
$input =~ s/"([^"]*)"/ repl($1) /ge;
编辑:如果只查找一个换行符群集,则必须排除前面的换行符。例如:
[^”\r\n]+
edit2:要将文件读入$input
,请执行以下操作
$/ = undef;
my $input = <$fh>;
$/=undf;
我的$input=;
难道不是\R
只是任何换行符吗?此外,引号之间可能有不连续的换行符等。另一个问题是引号,它们在完整输入中是否平衡?您似乎没有用任何文字来锚定开头。是的,\R我相信是任何换行符。我在这里看到一些搜索。我认为可能存在不一致连续换行符和其他我不想替换的字符,或者只想替换一个空格字符。我该如何锚定开始?你是说我希望在引用字符串之前看到的“,”或“,”之类的字符,或者“,”或“)“在引用的字符串之后?谢谢。您将文件拖入数组,然后逐行循环数据,但您的正则表达式表明您希望匹配多行字符串。那是行不通的。您可能希望/需要将文件转换为标量代码>和打印\@行
。我想这会突出你的一个问题。它默认为在换行符上拆分,因此根据定义,@lines
的每个元素都是一行。虽然s///eg
sub repl {
my ($content) = _@;
$content =~ s/\R+//g;
return $content;
}
$input =~ s/"([^"]*)"/ repl($1) /ge;
$/ = undef;
my $input = <$fh>;