盖伊我有一个字符串列表。
Select
id AS "cusId ",
name as 'cusName', gendar as ' Gendar.',
isPaid as " is'Paid ", total, remarks FROM
我需要一个返回的正则表达式:
Select
id
name
gendar
isPaid
total
remarks
FROM
并且还忽略逗号和'AS'关键字。
到目前为止,我可以使用preg_match_all('/(?<![\S"])([^"\'\s]+)(?![\S"])/')
并稍后过滤所有查询关键字,但是来到JavaScript时,正则表达式中没有任何后盾。
答案 0 :(得分:2)
免责声明:以下解决方案绝不是解析任意SQL查询的通用解决方案。要解析任意SQL查询,您需要构建或使用现有SQL查询。另请参阅How to parse / tokenize an SQL statement in Node.js 。
因此,考虑到 您的特定输入字符串,您可以使用与您不需要的匹配的正则表达式,然后捕获您需要的内容:< / p>
/"[^"]*"|'[^']*'|\s+AS\s+|\s*((?:(?!\sAS\s)[^,\s])+)/gi
请参阅regex demo
<强>解释强>:
"[^"]*"
- 匹配内部没有"
的双引号子字符串(如果您需要支持内部转义的"[^"\\]*(?:\\.[^"\\]*)*"
,则替换为"
)|
- 或'[^']*'
- 匹配内部没有'
的单引号子字符串(如果您需要在内部支持转义'[^'\\]*(?:\\.[^'\\]*)*'
,则替换为'
)|
- 或\s+AS\s+
- 1+空格内的“AS”字|
- 或\s*
- 0+ whitespaces ((?:(?!\sAS\s)[^,\s])+)
- 第1组捕获除,
以外的一个或多个符号以及未启动空格+ [^,\s])+
+空格序列的空白(请参阅AS
) 。它匹配任何非space
+ AS
+ space
。JS演示:
var re = /"[^"]*"|'[^']*'|\s+AS\s+|\s*((?:(?!\sAS\s)[^,\s])+)/gi;
var str = 'Select id AS "cusId ", name as \'cusName\', gendar as \' Gendar.\', isPaid as " is\'Paid " total , datetime FROM';
var res = [];
while ((m = re.exec(str)) !== null) {
if (m[1]) {
res.push(m[1]); // Add the Capture group 1 to the resulting array
}
}
document.body.innerHTML = "<pre>" + JSON.stringify(res, 0, 4) + "</pre>";