我需要一些正则表达式的帮助我正在创建一个带有节点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+)
以不区分大小写的方式匹配create
和table
以及中间的任何空格(1个或更多)。双引号是可选的,在\w+
匹配并捕获表名后。这个简写类代表[A-Za-z0-9_]
,所以我们可以稍微缩短代码。
然后,我们不能使用String#match
,因为我们需要找到多个匹配并抓取捕获的文本。因此,我建议使用RegExp#exec
。捕获的文本将位于m[1]
中,用于填充tables
变量。