如果匹配组前面没有“\”,则正则表达式替换,如果前面有“\\”,则除外

Regex replace if matching group not preceded by `\` exept if preceded by `\\`

我的目标

我想做的是类似这样的事情:

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}不会被替换。

当我希望能够转义反斜杠时,问题就出现了。例如,转义反斜杠的意思是:

我尝试了什么?
到目前为止我没有尝试很多事情,因为我完全不知道如何实现这一点,因为据我所知,javascript 正则表达式中没有 lookbehind 模式。

我希望我解释的方式足够清楚,可以理解,我希望有人有解决方案。

我建议你分步解决这个问题:)

1)第一步:

简化文本的反斜杠,将所有出现的 "\" 替换为 ""。这将消除所有冗余并使令牌替换部分更容易。

text = text.replace(/\\/g, '');

2)第二步:

要替换文本的标记,请使用此正则表达式:/[^\](${([^}]+)})/。这一个不允许在它们之前带有 \ 的标记。例如:\${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);
    });
}

如果您还有任何问题,请告诉我:)