Благодаря @Konrad мы можем окружить каждый элемент массива знаком ^ следующим образом:

const signs = [',', '!!', '?!', '!?', '...', '..', '.', '?', '؟!', '!؟', '!', '؟', ':'];

const input = 'this is, a text?'

const str = signs.map(e => e.replace(/\?/g, '\\?').replace(/\./g, '\\.')).join('|')

const regex = new RegExp(` ?(${str}) ?`, 'g')

const result = input.replace(regex, ' ^$1^ ').trim()

console.log(result)

Теперь проблема в том, если у вас есть этот ввод в виде строки:

this is ^,^ a text ^?^ ? вы получите повторение знака ^, а нам это не нужно:

this is ^ ^,^ ^ a text ^ ^?^ ^ ^?^

Вот желаемый результат на самом деле:

this is ^,^ a text ^?^ ^?^

2
Sara Ree 22 Ноя 2022 в 21:55

1 ответ

Лучший ответ

Ты можешь использовать

const signs = [',', '!!', '?!', '!?', '...', '..', '.', '?', '؟!', '!؟', '!', '؟', ':'];

const input = 'this is ^,^ a text ^?^ ?'

const str = signs.map(e => e.replace(/\?/g, '\\?').replace(/\./g, '\\.')).join('|')

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

const result = input.replace(regex, ' ^$1^ ').trim()

console.log(result)

Здесь я добавил (?:\\^\\s*)* на обоих концах, чтобы соответствовать нулю или более последовательностям ^ и нулю или более пробелам, и заменил литеральный пробел на \\s*, чтобы соответствовать любому нулю или более пробелам.

Обратите внимание, что экранирование лучше выполнять с помощью универсального решения, например Есть ли функция RegExp.escape в JavaScript?:

const str = signs.map(e => e.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&')).join('|')
1
Wiktor Stribiżew 22 Ноя 2022 в 22:01
Позвольте мне попробовать это, спасибо ...
 – 
Sara Ree
22 Ноя 2022 в 22:01
Удивительно .......
 – 
Sara Ree
22 Ноя 2022 в 22:12