Регулярное выражение для выбора слов с пробелами для замены

#javascript #regex #replace

#javascript #регулярное выражение #заменить

Вопрос:

У меня есть строка в JS, которую мне нужно добавить ' к значениям. Пример: task: task one, client: Mr jhon будет преобразован в task:'task one', client: 'Mr Jhon'

Считайте эти строки введенным пользователем поисковым запросом. Затем это отправляется в резервную копию для поиска. Значения должны быть заключены в '

Сложности

  • taskname: one two three, client: Mr Jhon может быть более 2 слов
  • taskname: one two, client: Mr Jhon более 1 пробела
  • taskname:one,client: Mr Jhon может быть одно слово без пробела
  • priority:1,groupname: Mr Singh имя может быть любым
  • priority:1,task: Mr Singh,planet:pluto,done:Yes Может быть более 2 точек данных

Я использую приведенный ниже код для преобразования в строку в Javascript.

 let myStr = `taskname: task one`
myStr = `${myStr},`
const finalStr = myStr.replace(/:((?:w*s*) ),/g, `:'$1',`)
console.log(finalStr)  

Вопрос 1: Является ли регулярное выражение эффективным?

PS: Я буду использовать это на сервере Node JS.

Комментарии:

1. Какова цель (?: в регулярном выражении

2. @PankajKumar, это Non-capturing group

3. Да, я оговорился. Тем не менее, похоже на проблему xy . Похоже, что вы пытаетесь создать здесь структуру пары ключ-значение, подобную JSON, и немного больший контекст того, откуда взялись эти данные, позволил бы вам сделать это более правильным способом, чем то, что вы пытаетесь здесь. Если ваш единственный вопрос заключается в том, является ли регулярное выражение производительным, это решать вам. Если это достаточно эффективно для вашего варианта использования, тогда да, в противном случае нет. Смотрите рейтинг производительности .

4. @ggorlen, спасибо. Добавлено объяснение. Да, это похоже на JSON.

5. Как насчет пользовательского ввода, такого как O'Neill (апостроф), Bond, James Bond (запятая) и Wednesday, 08:00 o'clock (двоеточие)? Никогда не недооценивайте пользователя! Также Mr Singh без точки является неправильной аббревиатурой, в то время как Pluto это имя (верхний регистр), а не существительное.

Ответ №1:

Возможно, что-то подобное сработало бы для вас

 let myStr = `taskname: task  one, client: Mr jhon
taskname: one two three, client: Mr Jhon there can be more than 2 words
taskname: one     two, client: Mr Jhon more than 1 space
taskname:one,client: Mr Jhon can be singe word without space
priority:1,groupname: Mr Singh the name of can be anything
priority:1,task: Mr Singh,planet:pluto,done:Yes There can be more than 2 data points`;

const finalStr = myStr.replace(
  /((?<=^w :)(.*?)(?=,)|(?<=w :)(.*?)(?=,)|(?<=w :)(.*?)$)/gim,
  (match) => `'${match.trim()}'`
);

console.log(finalStr);  

Ответ №2:

Это должно сработать нормально:

 let myStr = `taskname: one two three, client: Mr Jhon
taskname: one     two, client: Mr Jhon
taskname:one,client: Mr Jhon
priority:1,groupname: Mr Singh
priority:1,task: Mr Singh,planet:pluto,done:Yes`;

const finalStr = myStr.replace(/([^,:n] ):s*([^,:n] )/g, `$1:'$2'`)
console.log(finalStr)  

Вывод:

 taskname:'one two three', client:'Mr Jhon'
taskname:'one     two', client:'Mr Jhon'
taskname:'one',client:'Mr Jhon'
priority:'1',groupname:'Mr Singh'
priority:'1',task:'Mr Singh',planet:'pluto',done:'Yes'