【发布时间】: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的每个元素根据定义都是一行。