如何用正则提取`item_option`插入语句中引号内的目标内容?
解决SQL单引号内容提取的正则方案
要精准提取item_option表INSERT语句后的所有单引号内容,同时排除item表的部分,直接用下面的正则就能搞定:
正则表达式
(?<=INSERT INTO `item_option` \(id, type, name\) VALUES).*?('(?:''|[^'])*')
关键细节解释
- 定位目标位置:
(?<=INSERT INTOitem_option\(id, type, name\) VALUES)是正向后发断言,确保只在目标INSERT语句结束后开始匹配,完全跳过前面item表的内容。 - 处理多行SQL:搭配正则的
DOTALL模式(比如Python里的re.DOTALL),让.能匹配换行符,适配换行排版的SQL代码。 - 正确捕获转义单引号:
'(?:''|[^'])*'用来匹配单引号内的内容——''匹配SQL里转义的单引号,[^']匹配非单引号字符,避免把转义的单引号当成结束符。
实际使用示例(Python)
import re # 示例SQL代码 sql_content = """ INSERT INTO `item` (`id`, `name`) VALUES (1, 'Apple'), (2, 'Banana'); INSERT INTO `item_option` (`id`, `type`, `name`) VALUES (1, 'size', 'Large'), (2, 'color', 'Red'), (3, 'size', 'Small'); INSERT INTO `item` (`id`, `name`) VALUES (3, 'Orange'); """ # 编译正则并匹配 pattern = r"(?<=INSERT INTO `item_option` \(id, type, name\) VALUES).*?('(?:''|[^'])*')" result = re.findall(pattern, sql_content, re.DOTALL) # 输出结果:["'size'", "'Large'", "'color'", "'Red'", "'size'", "'Small'"] print(result)
如果你的SQL里字段名前后有空格(比如( id , type , name )),只需在正则的括号内加上\s*适配,比如:
(?<=INSERT INTO `item_option` \(id\s*,\s*type\s*,\s*name\) VALUES).*?('(?:''|[^'])*')
内容的提问来源于stack exchange,提问作者Nghi La
相关产品推荐
相关产品推荐

