如果匹配组前面没有“\”,则正则表达式替换,如果前面有“\\”,则除外
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}
不会被替换。
当我希望能够转义反斜杠时,问题就出现了。例如,转义反斜杠的意思是:
${hello.to}
会变成:${hello.to}
\${hello.to}
会变成:\world
\${hello.to}
会变成:${hello.to}
\\${hello.to}
会变成:\${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);
});
}
如果您还有任何问题,请告诉我:)
我的目标
我想做的是类似这样的事情:
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)第一步:
简化文本的反斜杠,将所有出现的 "\"
替换为 ""
。这将消除所有冗余并使令牌替换部分更容易。
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);
});
}
如果您还有任何问题,请告诉我:)