正则表达式中的空白困境

时间:2009-09-01 20:38:44

标签: regex perl whitespace

我使用一个简单的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}}。

提前感谢您的帮助,这真让我感到困惑。

2 个答案:

答案 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+)/)