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}">

使用上面的正则表达式,它将用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);

最新更新