我使用一个简单的Perl脚本来解析XML并将其转换为可用的SQL。我当前的SQL行是这样的:
INSERT INTO table VALUES ('data1', 'data2', 'data3', );
显然我需要在那里删除逗号。听起来很简单,但我无法让正则表达式找到它。我试过了s/,\s+\)/\)/
,但是当我运行它时,这并没有改变任何东西。奇怪的是,当s/,\s+/WTF/
应该替换所有逗号和它们旁边的空格时,s/\s+\)/something/
也不会修改任何内容。但是当我运行.
时,它会正确地找到并替换行尾的近括号。显然,逗号之后的空白字符是一些奇怪的幽灵角色,我无论如何都找不到。甚至没有,\s+\)
表达式。
真正奇怪的是,当我在Notepad ++中使用正则表达式选项在文档上使用Find时,当我输入\r
时,它会完美地找到所有这些,但Perl正则表达式中完全相同的序列将找不到它们。
我怀疑它是\n
(我正在使用Windows)的东西,因为我之前删除了\r
个字符,但它在整个sql文件中找不到{{1}}。
提前感谢您的帮助,这真让我感到困惑。
答案 0 :(得分:8)
首先,
$ perl -E 'my $foo = "bar, baz"; $foo =~ s/,\s+/WTF/; say $foo'
barWTFbaz
确实有效。 (对于perl 5.8及之前,将其更改为-e和print "$foo\n"
)
其次,你做错了。而不是做类似的事情:
$values = "'$values[0]', ";
$values .= "'$values[1]', ";
⋮
你应该这样做:
$values = join(q{,}, map("'$_'", @values)); # map adds 'quotes'; join adds commas
第三,你甚至不应该这样做,你应该使用占位符:
# note specifying the column names, its a good idea! Schema change.
my $query = "INSERT INTO table (col1, col2, col3) VALUES (?,?,?)";
my $sth = $dbh->prepare($query);
$sth->execute(@values);
答案 1 :(得分:2)
这个表达怎么样:
s/,\W+)/)