2010-05-07 72 views
0

我想從sqlite_master的sql列中提取SQLite結果集的列名。我在match()和split()函數的正則表達式中弄糟了。使用Javascript RegEx從SQLite中提取列名創建表SQL

t1.executeSql('SELECT name, sql FROM sqlite_master WHERE type="table" and name!="__WebKitDatabaseInfoTable__";', [], 
    function(t1, result) { 
    for(i = 0;i < result.rows.length; i++){ 
    var tbl = result.rows.item(i).name; 
    var dbSchema = result.rows.item(i).sql; 
// errors out on next line 
    var columns = dbSchema.match(/.*CREATE\s+TABLE\s+(\S+)\s+\((.*)\).*/)[2].split(/\s+[^,]+,?\s*/); 
    } 
    }, 
    function(){console.log('err1');} 
); 

我想分析SQL語句像這樣......

CREATE TABLE sqlite_sequence(name,seq); 
CREATE TABLE tblConfig (Key TEXT NOT NULL,Value TEXT NOT NULL); 
CREATE TABLE tblIcon (IconID INTEGER NOT NULL PRIMARY KEY,png TEXT NOT NULL,img32 TEXT NOT NULL,img64 TEXT NOT NULL,Version TEXT NOT NULL) 

到像論文絃樂...

name,seq 
Key,Value 
IconID,png,img32,img64,Version 

用正則表達式的任何幫助,將不勝感激。

回答

0

主要問題是\ s +在你的匹配正則表達式中。應該是/.*CREATE\s+TABLE\s+(\S+)\s*\((.*)\).*/)

第二個問題是拆分。我不太知道你試圖在正則表達式做,但這裏的多一點做的簡單的方法,它在所有的實例工作:

var columns= dbSchema.match(/.*CREATE\s+TABLE\s+(\S+)\s*\((.*)\).*/)[2].split(/,/); 
for(i = 0;i < columns.length; i++) { 
    columns[i] = columns[i].replace(/\s.*/g, ''); 
} 
+0

謝謝!我認爲它快到了。以下是#1中RegEx的輸出。 [ 「CREATE TABLE sqlite_sequence(名稱,序列)」, 「sqlite_sequence」, 「名稱,SEQ」] [ 「CREATE TABLE tblConfig(關鍵文本NOT NULL,價值TEXT NOT NULL)」, 「tblConfig」, 「關鍵TEXT NOT NULL,值TEXT NOT NULL」] 如果我運行#2,我得到[ 「創建」, 「sqlite_sequence」, 「名稱,序列」。不是我想要的。 如何去掉「INTEGER NOT NULL」和保留逗號的列[2]中的其他列屬性? – DataZombies 2010-05-07 02:56:23

+0

@NimbusSoftware - 見#2。 for循環替換 – DVK 2010-05-07 02:57:41

+0

列循環運行時會出現以下情況:[「CREATE」,「tblConfig」,「Key」]。除了列[2]中的第一個單詞外,其他所有內容都被刪除。我希望看到像這樣的專欄[2]:「關鍵,價值」。我非常感謝你的幫助。謝謝。 – DataZombies 2010-05-07 03:06:30