Regex 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; 我肯定我错过了什么

我有一个Perl脚本,它在纯文本文件中的数据库转储上运行,当我看到引号之间的字符串时,试图删除所有换行符实例和其他可能的奇数字符:

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>;