2015-09-18 56 views
1

我需要一些正則表達式的幫助我正在做一個程序與節點js加載sql與表結構並執行它們,我存儲在數組中的所有表名應該是創建。 我有下面的代碼,它的工作原理,但我想知道是否有更好的方法來做到這一點。在此先感謝..正則表達式來匹配表中的表名稱創建表語句

for (var i = 0, max = list.length; i < max; i++) { 
    (function (j) { 
     var sql = fs.readFileSync(path.join(__dirname, 'sql', list[j]), "utf8").toString(); 
     // var stmts = sql.match(/[_\"a-zA-Z0-9\s\,\(\)\*-]+;/gi); 
     var tables = sql.match(/CREATE\sTABLE\s\"?[A-Z0a-z0-9_]+\"?/gi); 
     if (tables) { 
      for (var k = 0, max = tables.length; k < max; k++) { 
       tables[k] = tables[k].replace(/create\stable\s+?/gi, ''); 
       tables[k] = tables[k].replace(/\"/, ''); 
       console.log("========= table name =========="); 
       console.log(tables[k]); 
      } 
     } 
    })(i); 
} 
+0

更好地以什麼方式?更快?更高的內存效率?更可讀?更少的錯誤傾向?更靈活?所有這些,甚至更多,都可以用「更好」這個術語來表示,但它們往往是相互衝突的目標。 –

回答

0

說實話,沒有在你的代碼有一些重複:你匹配一個正則表達式較長子,然後再次使用正則表達式進行額外的正則表達式替換。我建議只使用一個正則表達式匹配和捕捉我們需要一次:

var sql = "create table \"myTable\"  CREATE TABLE new_table12 --"; 
 
var re = /CREATE\s+TABLE\s+\"?(\w+)/gi; 
 
var tables = []; 
 
var m; 
 
while((m=re.exec(sql)) !== null) { 
 
     tables.push(m[1]); 
 
     document.write("= table name =<br/>"); // for demo only 
 
     document.write(m[1]+"<br/>");   // for demo only 
 
} 
 
alert(tables);

CREATE\s+TABLE\s+\"?(\w+)在不區分大小寫的方式和任何空白(1個或多個)匹配createtable正則表達式在兩者之間。雙引號是可選的,在它之後\w+匹配並捕獲表名。這個速記課代表[A-Za-z0-9_],所以我們可以縮短代碼。

然後,我們不能使用String#match,因爲我們需要找到多個匹配並抓取捕獲的文本。因此,我建議使用RegExp#exec。捕獲的文本將在m[1]中用於填充tables變量。

+1

我不知道exec的方法,現在我知道謝謝 –

+1

謝謝你的建議,我想我已經標記爲已回答 –