【问题标题】:perl regex remove newlines in stringperl 正则表达式删除字符串中的换行符
【发布时间】:2016-02-11 13:20:24
【问题描述】:

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

匹配这样的字符串:

“这是

我的\t 测试

字符串。

就这样!”

我现在彻底迷惑了。 :)

【问题讨论】:

  • \R 不是换行符吗?此外,引号之间可能有不连续的换行符等。另一个问题是引号,它们在完整输入中是否平衡?你似乎没有用任何文字来锚定开头。
  • 是的,\R 是我相信的任何换行符。我在这里看到了一些搜索。我认为可能有不连续的换行符和其他我想用任何内容替换的字符,或者只是一个空格字符。我将如何锚定开始?您的意思是像“,”或“,”这样的东西,我希望在引用的字符串之前看到,并且可能在引用的字符串之后看到“,”或“)”?谢谢。
  • 您将文件放入数组中,然后逐行遍历数据,但您的正则表达式表明您要匹配多行字符串。那是行不通的。您可能希望/需要将文件转换为标量。
  • 试试use Data::Dumper;print \@lines。我认为这将突出您的一个问题。它默认在换行符上拆分,因此@lines 的每个元素根据定义都是一行。

标签: regex string perl replace


【解决方案1】:

真正的问题是,当引号之间可能有很多组时,您只会找到一组\R。最好的办法是使用引号之间的一般匹配进行回调 (eval),然后替换 \R 的 in
替换。

类似:

sub repl {
  my ($content) = _@;
  $content =~ s/\R+//g;
  return $content;
}

$input =~ s/"([^"]*)"/ repl($1) /ge;

编辑:如果您只寻找 1 个换行集群,则必须
排除导致它的换行符。例如:[^"\r\n]+

edit2: 要将文件插入$input,请执行

$/ = undef;
my $input = <$fh>; 

【讨论】:

  • 虽然s///eg 不完全确定评估表
猜你喜欢
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 2011-03-21
  • 2011-07-01
  • 1970-01-01
相关资源
最近更新 更多