2013-08-07 73 views
0

我正在編寫一個腳本來從文件中提取和轉換SQL語句。我需要將SQL卸載從gupta sqlbase數據庫轉換爲SQLServer可以理解的SQL。這個替換爲什麼也會刪除一個空格字符?

一個任務是用兼容的名稱替換不允許作爲列名的關鍵字。

在以下代碼中$ commands是一個包含sql語句的數組ref。 (居然還有更多的代碼在這裏,但我提取它,因爲它不應該與此有關)

my @KeyWords = ("LEFT", "RIGHT", "PERCENT", "FILE", "PRINT", "CROSS", "PLAN", "TOP", "END", "FILE", "Default", "CHECK", "TEXT"); 

foreach $cmd (@$commands) { 

    foreach my $kw (@KeyWords) { 
     $cmd =~ s/\b$kw\b[^(]/_$kw/gi; 
    } 


    push @$converted, $cmd; 
} 

這工作對大多數語句,但在下面的命令"DEFAULT"獲取與"_DEFAULT,而不是"_DEFAULT"取代。所以第二個引號丟失了。

CREATE TABLE SYSADM.SUBTYPE (ID_SUBTYPE INTEGER NOT NULL, 
    ID_TYPE INTEGER NOT NULL, 
    TYPE VARCHAR(1), 
    BEZEICH VARCHAR(60), 
    NUM_COLOR INTEGER, 
    NUM_TXTCOLOR INTEGER, 
    "DEFAULT" SMALLINT, 
    GENER_ARBA SMALLINT, 
    PROJEKTPLANUNG SMALLINT) 

有沒有辦法修改正則表達式/替換,所以這不會刪除第二個引號?或者以其他方式?

回答

3

[^(]匹配任何不是左開頭的單個字符。

你想用一個負零寬度預測先行斷言,而不是:

s/\b$kw\b(?!\()/_$kw/gi; 

(或者:(?![(])

你也可以添加替換的回字符串:

s/\b$kw\b([^(])/_$kw$1/gi; 

但請注意,這不適用於所有情況。特別是如果關鍵字之後沒有任何內容,則此模式不匹配,而零寬度斷言將會匹配。

+0

工作正常,謝謝! – Luke

相關問題