2013-05-07 171 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;