JavaScriptRegex在SQL插入中的单引号内获取多个单引号



问题

我正在进行数据库迁移,遇到了以下情况,我在插入的单引号中有一个单引号,经过几次尝试修复,我得出了需要使用regex的结论,我可以替换文本中心的单引号,我现在一开始就有问题。我的regex有前两个单引号,但我的目标是后两个。

SQL插入:

(1, '22', '2006-11-10', '3', 'field1', 'field2', '2006-12-12', '11:20:06', '''field3', '
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus ex ipsum, luctus id dignissim tempor, volutpat eget sapien. Cras accumsan molestie iaculis. Mauris vehicula a nunc vel tincidunt. 
Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. 
- Lorem ipsum dolor '' sit amet - ''''
Aliquam vestibulum tincidunt odio, id varius sapien lacinia ac. Phasellus ullamcorper ante ut lacus dictum commodo.
Integer sit amet lacus ornare massa feugiat tempus. 
', null, null);

我的Regex(js(:

((["'])(?:(?=(''?))2)*?)1(?!,)

在regexp之后,我的目标是进行查找和替换,结果是:

(1, '22', '2006-11-10', '3', 'field1', 'field2', '2006-12-12', '11:20:06', '''field3', '
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus ex ipsum, luctus id dignissim tempor, volutpat eget sapien. Cras accumsan molestie iaculis. Mauris vehicula a nunc vel tincidunt. 
Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. 
- Lorem ipsum dolor '' sit amet - ''''
Aliquam vestibulum tincidunt odio, id varius sapien lacinia ac. Phasellus ullamcorper ante ut lacus dictum commodo.
Integer sit amet lacus ornare massa feugiat tempus. 
', null, null);

我正在使用此网站进行测试:https://regex101.com/(选择javascript(

一个选项是匹配'"分隔符,然后惰性重复,直到再次匹配该分隔符,后跟逗号(或者),如果该项是列表中的最后一个(。然后,使用replacer函数将分隔符内的所有内容替换为'sescaped:

const input = `(1, '22', '2006-11-10', '3', 'field1', 'field2', '2006-12-12', '11:20:06', '''field3', '
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus ex ipsum, luctus id dignissim tempor, volutpat eget sapien. Cras accumsan molestie iaculis. Mauris vehicula a nunc vel tincidunt. 
Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. 
- Lorem ipsum dolor '' sit amet - ''''
Aliquam vestibulum tincidunt odio, id varius sapien lacinia ac. Phasellus ullamcorper ante ut lacus dictum commodo.
Integer sit amet lacus ornare massa feugiat tempus. 
', null, null);`;
const output = input.replace(
/(["'])([sS]*?)1(?=[,)])/g,
(_, delim, content) => delim + content.replace(/'/g, "\'") + delim
);
console.log(output);

https://regex101.com/r/RRmq8g/1

如果您想在分隔符为"时像这样转义",那么从delim:构造替换正则表达式

const output = input.replace(
/(["'])([sS]*?)1(?=[,)])/g,
(_, delim, content) => {
const pattern = new RegExp(delim, 'g')
return delim + content.replace(pattern, '\' + delim) + delim
}
);

const input = `(1, "22 foo bar "double quotes" here ", '2006-11-10', '3', 'field1', 'field2', '2006-12-12', '11:20:06', '''field3', '
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus ex ipsum, luctus id dignissim tempor, volutpat eget sapien. Cras accumsan molestie iaculis. Mauris vehicula a nunc vel tincidunt. 
Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. 
- Lorem ipsum dolor '' sit amet - ''''
Aliquam vestibulum tincidunt odio, id varius sapien lacinia ac. Phasellus ullamcorper ante ut lacus dictum commodo.
Integer sit amet lacus ornare massa feugiat tempus. 
', null, null);`;
const output = input.replace(
/(["'])([sS]*?)1(?=[,)])/g,
(_, delim, content) => {
const pattern = new RegExp(delim, 'g')
return delim + content.replace(pattern, '\' + delim) + delim
}
);
console.log(output);

/(["'])([sS]*?)1(?=[,)])/g表示:

  • (["'])匹配并捕获分隔符
  • ([sS]*?)-重复任何字符,直到达到:
  • 1-分隔符,后跟
  • (?=[,)])-逗号或)

最新更新