我需要从字符串中挑选特定的单词。文字是动态的。
const KEY_VAL_MAP = { car: vehicle };
const KEY = 'car';
let sampleString = 'hey this i need to replace car ${car}';
sampleString = sampleString.replace(new RegExp(`\b(?:${KEY})\b`, 'g'), KEY_VAL_MAP[_key]);
预期结果是:"嘿,我需要更换车辆${car}">
使用上面的正则表达式,它将用vehicle
替换每个car
。regex中需要更新的内容,以便排除${}
下字符串中的所有内容。
您可以使用此正则表达式来避免匹配${...}
子字符串:
(?<!${)bcarb(?!})
RegEx演示
RegEx详细信息:
(?<!${)
:Negative Lookbacking断言我们的匹配词之前没有${
bcarb
:匹配完整单词car
(?!})
:否定前瞻,断言匹配单词后没有}
代码:
const KEY_VAL_MAP = { car: 'vehicle' };
const KEY = 'car';
let sampleString = 'hey this i need to replace car ${car}';
sampleString = sampleString.replace(new RegExp(`(?<!\$\{)\b(?:${KEY})\b(?!})`, 'g'), KEY_VAL_MAP[KEY]);
console.log(sampleString);
您可以使用负向前看和向后看来排除${}
之间单词的匹配项。
(?<!${)bcarb(?!})
const KEY_VAL_MAP = { car: 'vehicle' };
const KEY = 'car';
let sampleString = 'hey this i need to replace car ${car}';
sampleString = sampleString.replace(new RegExp(`(?<!\$\{)\b${KEY}\b(?!\})`, 'g'), KEY_VAL_MAP[KEY]);
console.log(sampleString);
此外,一些浏览器(如safari(不支持lookbehinds。因此,如果你希望你的代码也能在这些浏览器上工作,你可以使用另一个使用捕获组的变通方法:
(${car})|bcarb
如果这群人抓到什么东西,不要碰。否则进行更换。
const KEY_VAL_MAP = { car: 'vehicle' };
const KEY = 'car';
let sampleString = 'hey this i need to replace car ${car}';
sampleString = sampleString.replace(new RegExp(`(\$\{${KEY}\})|\b${KEY}\b`, 'g'), (_, g) => g ?? KEY_VAL_MAP[KEY]);
console.log(sampleString);