正则表达式替换,如果匹配组前面没有`\`exept,如果前面是'\\`

时间:2017-07-30 04:24:56

标签: javascript node.js regex negative-lookbehind

我的目标

我想做的是类似的事情:



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 模式。

我希望我解释它的方式很清楚,我希望有人有解决方案。

1 个答案:

答案 0 :(得分:1)

我建议您分别在以下步骤中解决此问题:)

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);
    });
}

如果您仍然遇到任何问题,请告诉我们:)