JavaScript replaceAll 不区分大小写的搜索使用变量而不是字符串

JavaScript replaceAll case-insensitive search using variable rather than a string

我想在不区分大小写的搜索中使用变量(而不是字符串)进行 JavaScript replaceAll(),同时保留匹配文本的大小写(在 return).例如,

console.log('doc.p:', doc.p.toString().substring(0, 26))
var query = this.manager.store.get('q').value.toString();
console.log('query:', query, '| type:', typeof(query))
console.log(doc.p.toString().replaceAll(/(dna)/gi, '******'))
console.log(doc.p.toString().replaceAll(/(query)/gi, '******'))

正在给予

doc.p: DNA deoxyribonucleic acid     // target text
query: dna | type: string            // query text
***DNA*** deoxyribonucleic acid ...  // [success] case-insensitive search; case-sensitive return
DNA deoxyribonucleic acid ...        // [failure] I've also tried (e.g.) $query, $(query), ... here

我的动力来自 , and also tried

工作完成后,我将用 HTML 代码替换“***”(仅用于测试/说明)。

基本上,您想要的是创建一个动态正则表达式,而不是对其进行硬编码。这是在 的帮助下完成的。 RegExp 构造函数,它采用正则表达式和标志的字符串表示(我弄乱了字符串大写以演示大小写的保存):

string1 = 'DnA deoxyribonucleic acid'
string2 = 'DNA deoxyribonucleic aCId'

const replacer = (str, replace) => {
  const re = new RegExp(`(${replace})`, 'gi')
  return str.replaceAll(re, '******')
}

console.log(replacer(string1, 'dna'))
console.log(replacer(string2, 'acid'))

JavaScript 的 replace 已经具有进行不区分大小写搜索的功能,同时还保留捕获组的原始大小写,例如

var input = "DNA deoxyribonucleic acid";
var output = input.replace(/(dna)/ig, "******");
console.log(output);

您需要使用 RegExp -

创建正则表达式
var reg = new RegExp(`(${query})`, "gi")

var doc = "DNA deoxyribonucleic acid";
var query = "dna"
var exp = `(${query})`
var reg = new RegExp(exp, "gi")
var result = doc.replaceAll(reg, "******");
console.log(result);