regex 使用^符号 Package 符号数组时出现问题

omqzjyyz  于 2022-11-26  发布在  其他
关注(0)|答案(1)|浏览(112)

下面是一个函数,它可以用^符号 Package 一个符号数组,它对string1很有效,让我们来看看:

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

正如你所看到的,对于一个普通的string1,这个函数工作得很好,但是正如你所看到的,在string2中,如果已经有一个单词用^ Package ,例如靠近,符号,那么^中的一个将被删除。
对于string2的期望结果应该是:

"this is a text ^,^ ^right^"

您将如何解决此问题?

91zkwejq

91zkwejq1#

然后,仅删除所找到的匹配项之前/之后的^

const regex = new RegExp(`\\s*\\^?(${str})\\^?\\s*`, 'g');

请参见固定演示:

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

相关问题