Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I want to do a JavaScript replaceAll() using a variable (rather than a string) in a case-insensitive search, but also retaining the case of the matched text (in the return). For example,

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***'))

is giving

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

I was motivated by https://stackoverflow.com/a/19161971/1904943 , and also tried https://stackoverflow.com/a/494046/1904943

Once working, I'll be replacing the '***' (solely for testing / illustration) with HTML code.

like image 253
Victoria Stuart Avatar asked Sep 05 '26 19:09

Victoria Stuart


2 Answers

You need create regex expression using 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);
like image 113
Nikhil Patil Avatar answered Sep 07 '26 08:09

Nikhil Patil


JavaScript's replace already has the functionality of doing a case-insensitive search while also retaining the original case of a capture group, e.g.

var input = "DNA deoxyribonucleic acid";
var output = input.replace(/(dna)/ig, "***$1***");
console.log(output);
like image 30
Tim Biegeleisen Avatar answered Sep 07 '26 08:09

Tim Biegeleisen



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!