regexp匹配sql create table语句中的表名

时间:2015-09-18 17:57:25

标签: javascript sql regex node.js

我需要一些正则表达式的帮助我正在创建一个带有节点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);
} 

1 个答案:

答案 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+)以不区分大小写的方式匹配createtable以及中间的任何空格(1个或更多)。双引号是可选的,在\w+匹配并捕获表名后。这个简写类代表[A-Za-z0-9_],所以我们可以稍微缩短代码。

然后,我们不能使用String#match,因为我们需要找到多个匹配并抓取捕获的文本。因此,我建议使用RegExp#exec。捕获的文本将位于m[1]中,用于填充tables变量。