#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'