从字符串中提取特定的子字符串 - Javascript

Plucking specific substring from string - Javascript

我有一个生成的动态字符串,如下所示:

var q = "FROM Table SELECT avg(1), avg(2), avg(3) where x='y'

var q = "SELECT avg(1), avg(2), avg(3) FROM Table where z='x' since x days ago

select 之后的值也是动态的,其中可能有 1 个 select 选项或 10 个。我正在尝试创建一些逻辑以始终采摘 select 中的任何内容ed 到一个数组中,但在处理动态性质时遇到了麻烦(字符串是动态构造的并且 select 的 # 是动态的)。

基本上,最终结果是这样的:

['avg(1)', 'avg(2)', 'avg(3)']

目前我正在做类似下面的事情,但它总是希望字符串按特定顺序格式化(总是在要提取的字段之后以 SELECTwhere 开头):

let splitQ = q.match(".*SELECT(.*)where");
let selects = splitQ[1].trim().split(",");

这是一个可行的解决方案。 它对查询做出这些假设(小写后)。

  • 值出现在单词 'select '
  • 的第一个实例之后
  • 如果查询以 'from' 开头,值在“where”的第一个实例之前结束
  • 如果查询以 'select' 开头,值在“from”的第一个实例之前结束

const test1 = "FROM Table SELECT avg(1), avg(2), avg(3) where x='y'";

const test2 = "SELECT avg(1), avg(2), avg(3) FROM Table where z='x' since x days ago";



function extractValues(query) {
  // in both scenarios, the values always come directly after 'select '
  const valuesComeAfterMe = 'select ';
  query = query.toLowerCase();
  let valuesEndBeforeMe;
  // conditionally handle both query syntaxes
  if (query.startsWith('from')) {
    valuesEndBeforeMe = ' where';
  } else if (query.startsWith('select')) {
    valuesEndBeforeMe = ' from';
  } else {
    throw Error('query not handled');
  }
  // remove start
  query = query.slice(query.indexOf(valuesComeAfterMe) + valuesComeAfterMe.length);
  // remove end
  query = query.slice(0, query.indexOf(valuesEndBeforeMe));
  // split values and trim whitespace
  return query.split(',').map(item => item.trim());
}

console.log(extractValues(test1));
console.log(extractValues(test2));