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

问题描述

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

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,'***$1***'))
console.log(doc.p.toString().replaceAll(/(query)/gi,'***$1***'))

正在给予

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

我受到了 https://stackoverflow.com/a/19161971/1904943 的激励,也尝试了 https://stackoverflow.com/a/494046/1904943

一旦工作,我将用 HTML 代码替换“***”(仅用于测试/插图)。

解决方法

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

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

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

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

,

您需要使用 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,"***$1***");
console.log(result);

,

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

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