我有一個生成的動態字串,如下所示:
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
選擇后的值也是動態的,其中可能有 1 個選擇選項或 10。我正在嘗試創建一些邏輯以始終將選擇的任何內容提取到陣列中,但在處理動態性質時遇到了麻煩(字串是動態構造的并且選擇的數量是動態的)。
基本上,最終結果是這樣的:
['avg(1)', 'avg(2)', 'avg(3)']
目前我正在做類似以下的事情,但它總是希望字串以特定順序格式化(總是從要采摘的欄位開始SELECT和之后):where
let splitQ = q.match(".*SELECT(.*)where");
let selects = splitQ[1].trim().split(",");
uj5u.com熱心網友回復:
這是一個有效的解決方案。它對查詢做出這些假設(小寫后)。
- 這些值出現在單詞“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));
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/444960.html
標籤:javascript 正则表达式 分裂
