我需要从字符串中挑选特定的词。文字是动态的。
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}';
使用上述正则表达式,它将用 car
替换每个 vehicle
。什么需要在正则表达式中更新,以便排除 ${}
下字符串中的所有内容。
答案 0 :(得分:4)
您可以使用此正则表达式来避免匹配 ${...}
子字符串:
(?<!\$\{)\bcar\b(?!})
正则表达式详情:
(?<!\$\{)
:否定 Lookbehind 断言我们在匹配词之前没有 ${
\bcar\b
:匹配完整的单词 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);
答案 1 :(得分:1)
您可以使用否定前瞻和后向排除 ${}
之间的单词的匹配项。
(?<!\$\{)\bcar\b(?!\})
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)不支持后视。因此,如果您希望您的代码也适用于这些浏览器,您可以使用另一种使用捕获组的解决方法:
(\$\{car\})|\bcar\b
如果小组抓到任何东西,不要碰。否则更换。
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);