Here is a function to wrap an array of signs with ^
sign, and it works fine for string1
, let's have a look:
function modifyAuto(string) {
const allSigns = ['!!', '?!', '!?', '...', '..', '.', '?', '؟!', '!؟', '!', '؟', '،', '؛', ','];
const str = allSigns.map(e => e.replace(/\?/g, '\\?').replace(/\./g, '\\.')).join('|');
const regex = new RegExp(`\\s*(?:\\^\\s*)*(${str})\\s*(?:\\^\\s*)*`, 'g');
return string.replace(regex, ' ^$1^ ');
}
const string1 = 'this is a text, right';
const string2 = 'this is a text, ^right^';
console.log('works fine :::', modifyAuto(string1))
console.log('one of the ^ signs removed :::', modifyAuto(string2))
as you see for a normal string1
the function works fine, but as you see in string2
if there is already a word wrapped with ^
close to a ,
sign for instance , one of the ^
will be removed.
the desired result for the string2
should be :
"this is a text ^,^ ^right^"
How would you fix this?
CodePudding user response:
Then only remove ^
s that are immediately before/after the found match with
const regex = new RegExp(`\\s*\\^?(${str})\\^?\\s*`, 'g');
See the fixed demo:
function modifyAuto(string) {
const allSigns = ['!!', '?!', '!?', '...', '..', '.', '?', '؟!', '!؟', '!', '؟', '،', '؛', ','];
const str = allSigns.map(e => e.replace(/\?/g, '\\?').replace(/\./g, '\\.')).join('|');
const regex = new RegExp(`\\s*\\^?(${str})\\^?\\s*`, 'g');
return string.replace(regex, ' ^$1^ ');
}
const string1 = 'this is a text, right';
const string2 = 'this is a text, ^right^';
console.log('works fine :::', modifyAuto(string1))
console.log('one of the ^ signs removed :::', modifyAuto(string2))