正则表达式选择特定单词

时间:2021-05-10 05:04:30

标签: javascript regex

我需要从字符串中挑选特定的词。文字是动态的。

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。什么需要在正则表达式中更新,以便排除 ${} 下字符串中的所有内容。

2 个答案:

答案 0 :(得分:4)

您可以使用此正则表达式来避免匹配 ${...} 子字符串:

(?<!\$\{)\bcar\b(?!})

RegEx Demo

正则表达式详情:

  • (?<!\$\{):否定 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);

相关问题