Javascript正则表达式获取字符串列表不是单引号或双引号

时间:2016-07-14 09:03:28

标签: javascript php jquery regex

盖伊我有一个字符串列表。

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时,正则表达式中没有任何后盾。

1 个答案:

答案 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>";