我正在嘗試為字串(如在 javascript 中動態評估的準備好的陳述句)實作替換機制。我有替代品
[{username:"Max",age:10}]
例如,假設我們將字串作為輸入(username) is (age),因此查找替換很容易通過屬性及其值進行。
但是,我想要更高級的東西,括號被“識別”并從內到外評估,例如輸入:
[{username:"Max",age:10,myDynamicAttribute:"1",label1:'awesome', label2:'ugly'}]
和字串
(username) is (age) and (label(myDynamicAttribute))。在替換的第一次迭代中,字串應該變成
(username) is (age) and (label1)
and 在 second Peter is 10 and awesome。是否有任何工具或模式可以用來首先“理解”內括號并評估另一個?我嘗試了正則運算式,但無法創建先匹配內括號然后匹配外括號的正則運算式。
uj5u.com熱心網友回復:
我們可以撰寫一個正則運算式,找到一個不包含內部括號的帶括號的運算式,使用運算式的內部作為我們資料物件的鍵,用該值替換整個運算式,然后遞回。當字串不包含這樣的括號運算式時,我們將停止,并原封不動地回傳字串。
這是一種方法:
const interpolate = (data, str, parens = str .match (/\(([^\(\)] )\)/)) =>
parens ? interpolate (data, str. replace (parens [0], data [parens [1]])) : str
const data = {username: 'Max', age: 10, myDynamicAttribute: '1', label1: 'awesome', label2: 'ugly'}
const str = `(username) is (age) and (label(myDynamicAttribute))`
console .log (interpolate (data, str))
這將導致使用這些字串進行一系列遞回呼叫:
"(username) is (age) and (label(myDynamicAttribute))",
"Max is (age) and (label(myDynamicAttribute))",
"Max is 10 and (label(myDynamicAttribute))",
"Max is 10 and (label1)",
"Max is 10 and awesome"
uj5u.com熱心網友回復:
您可以對字串進行標記,并使用遞回替換器一次性遍歷標記。如果括號內的文本與物件屬性不匹配,則它們保持原樣。當從物件中檢索的字串中出現括號時,它們被視為文字,并且不會嘗試再次對它們執行查找。
function interpolate(encoded, lookup) {
const tokens = encoded.matchAll(/[^()] |./g);
function* dfs(end="") {
while (true) {
const {value, done} = tokens.next();
if (value == end || done) return;
if (value != "(") yield value;
else {
const key = [...dfs(")")].join("");
yield lookup[key] ?? `(${key})`;
}
}
}
return [...dfs()].join("");
}
// Example run
const lookup = {
username: "Max",
age: 10,
myDynamicAttribute: "1",
label1019: 'awesome(really)', // These parentheses are treated as literals
really: "not", // ...so that this will not be retrieved
label2: 'ugly',
};
const str = "1) (username) is (age) (uh!) and (label(myDynamicAttribute)0(myDynamicAttribute)9)"
const res = interpolate(str, lookup);
console.log(res);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/525927.html
上一篇:正則運算式在特定行中添加擴展名
下一篇:正則運算式字串沒有產生預期的結果
