从字符串中提取特定的子字符串 - 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)']
目前我正在做类似下面的事情,但它总是希望字符串按特定顺序格式化(总是在要提取的字段之后以 SELECT
和 where
开头):
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));
我有一个生成的动态字符串,如下所示:
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)']
目前我正在做类似下面的事情,但它总是希望字符串按特定顺序格式化(总是在要提取的字段之后以 SELECT
和 where
开头):
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));