2013-05-07 169 views
1

我有一个SQL语句:正则表达式用Perl

uPdate emp set emp_note='I am set to this ' where emp_name='John'; 

我想替换甲骨文的具体陈述中大写,所以我做到以下几点:

+89  $line =~ s/ where/WHERE /ig; 
    +90  $line =~ s/ set/SET /g; 
    +91  $line =~ s/^select/SELECT/ig; 
    +92  $line =~ s/^update/UPDATE/ig; 
    +93  $line =~ s/^delete/DELETE/ig; 
    +94  $line =~ s/^insert/INSERT/ig; 
    +95  $line =~ s/ and/AND /g; 
    +96  $line =~ s/ from/FROM /g; 
    +97  $line =~ s/ in/IN /g; 

上面还取代它们是文本值(我设置为此)。例如上面会呈现语句:

UPDATE emp SET emp_note='I am SET to this ' WHERE emp_name='John'; 

我怎样才能避免这种设置Perl来替代SQL语句中唯一的关键字,而不是价值?

问题还在于,我不能使用Perl提供的任何SQL包,所以我必须使用普通的旧式正则表达式。

+3

我怀疑,答案是“停止玩正则表达式并学会爱['SQL :: Translator'](https://metacpan.org/module/SQL::Translator)“。 – Quentin 2013-05-07 12:27:46

+0

我无法访问这些软件包。有其他选择吗? – contravaluebets 2013-05-07 12:29:47

+0

http://www.perlmonks.org/?node_id=693828 – Quentin 2013-05-07 12:30:16

回答

2

写一个可以理解SQL语法的正则表达式并且只替换你想要的东西将会非常困难。实际上,这可能是不可能的,因为正则表达式本身不能解析像SQL这样的语法。你可能会把它翻转过来,这样它就不会用引号内的东西来代替,但那不会很好,反正它也不会是一个完整的解决方案。

因此,您需要的是可以实际解析SQL,然后按照您的意愿用大写字母重新组合关键字的解析语句。

0

在你的sql语句中使用主变量而不是字面字符串。

无论如何,你应该使用它们来安全考虑(SQL注入的危险)。

每一个体面的API支持他们。如果你没有,“安全”令牌几乎肯定会令你的管理员安装另一个其中之一呢?;-)

0

你可以这样做:

use strict; 
my $query = "uPdate emp set emp_note='I am\' set to this ' where emp_name='John'"; 
$query =~ s/('(?>[^']++|(?<!\\)')')|\b(update|where|set|select|delete|insert|and|from|in)\b/$1\U$2/gi; 
print $query;