我想做的是类似的事情:
let json_obj = {
hello: {
to: 'world'
},
last_name: {
john: 'smith'
},
example: 'a ${type}', // ${type} -> json_obj.type
type: 'test'
}
// ${hello.to} -> json_obj.hello.to -> "word"
let sample_text = 'Hello ${hello.to}!\n' +
// ${last_name.john} -> json_obj.last_name.john -> "smith"
'My name is John ${last_name.john}.\n' +
// ${example} -> json_obj.example -> "a test"
'This is just ${example}!';
function replacer(text) {
return text.replace(/\${([^}]+)}/g, (m, gr) => {
gr = gr.split('.');
let obj = json_obj;
while(gr.length > 0)
obj = obj[gr.shift()];
/* I know there is no validation but it
is just to show what I'm trying to do. */
return replacer(obj);
});
}
console.log(replacer(sample_text));

到目前为止,这很容易做到。
但如果$
前面有反斜杠(\
),我不想替换括号之间的东西。例如:\${hello.to}
不会被替换。
当我希望能够逃避反斜杠时,问题就会成长。我的意思是逃避反斜杠是例如:
\${hello.to}
将成为:${hello.to}
\\${hello.to}
将成为:\world
\\\${hello.to}
将成为:\${hello.to}
\\\\${hello.to}
将成为:\\${hello.to}
我尝试了什么?
到目前为止,我没有尝试过很多东西,因为我完全不知道如何实现这一点,因为据我所知,javascript正则表达式中没有 lookbehind 模式。
我希望我解释它的方式很清楚,我希望有人有解决方案。
答案 0 :(得分:1)
我建议您分别在以下步骤中解决此问题:)
简化文字的反斜杠,替换"\\"
的所有""
次出现。这将消除所有冗余并使令牌更换部件更容易。
text = text.replace(/\\\\/g, '');
要替换文本的标记,请使用此正则表达式:/[^\\](\${([^}]+)})/
。这个不允许在他们之前使用\的令牌。例如:\ $ {hello.to}。
function replacer(text) {
return text.replace(/[^\\](\${([^}]+)})/, (m, gr) => {
gr = gr.split('.');
let obj = json_obj;
while(gr.length > 0)
obj = obj[gr.shift()];
/* I know there is no validation but it
is just to show what I'm trying to do. */
return replacer(obj);
});
}
如果您仍然遇到任何问题,请告诉我们:)