正则匹配多模式提取SQL表名:R语言str_extract使用问题
解决SQL DELETE语句中提取表名的问题
我来帮你搞定这个表名提取的问题,其实不用搞多模式列表,一个正则就能覆盖你所有的示例场景,而且能精准去掉前面的delete from前缀。
问题分析
你之前的正则[^_]+\\.[\\w]+\\_[\\w]+有两个明显的问题:
[^_]+只能匹配不包含下划线的字符串,所以像ss_pear这种带下划线的数据库名就匹配失败了- 没有处理前面的
delete from前缀,导致可能把前缀也包含进来,或者匹配范围不对
解决方案
我们可以用两种方法来精准提取表名:
方法1:正向预查(只捕获表名部分)
利用正则的正向预查特性,先定位到delete from后面的内容,再捕获符合数据库名.表名格式的字符串:
library(stringr) # 处理带任意空格的情况(比如delete from),用\\s+匹配多个空格 sql_data$table_name <- str_extract( sql_data$Full.Sql, "(?<=delete\\s+from\\s+)[\\w_]+\\.[\\w_]+", ignore.case = TRUE # 兼容大小写,比如Delete FROM )
正则解释:
(?<=delete\\s+from\\s+):正向预查,确保前面是delete from(支持任意多个空格),但不会把这部分包含到结果里[\\w_]+:匹配数据库名,支持字母、数字、下划线(包括多个下划线,比如ss_pear)\\.:匹配点号(需要转义)[\\w_]+:匹配表名,同样支持下划线(比如admin_user)
方法2:捕获组(更直观的分组提取)
如果觉得正向预查不好理解,也可以用捕获组,先用正则匹配整个delete from 表名的片段,再提取表名所在的分组:
sql_data$table_name <- str_match( sql_data$Full.Sql, "delete\\s+from\\s+([\\w_]+\\.[\\w_]+)", ignore.case = TRUE )[, 2]
这里str_match会返回一个矩阵,第二列就是我们用括号()捕获的表名部分。
验证效果
用你的三个示例测试:
delete from pear.admin where jdjdj→ 提取pear.admindelete from pear.admin_user where blah→ 提取pear.admin_userdelete from ss_pear.admin_user where blah→ 提取ss_pear.admin_user
三个场景都能正确匹配。
额外提示
如果你的SQL语句里可能存在其他格式(比如带反引号、引号的表名),可以再调整正则,但目前你的示例里不需要。如果有这种情况,比如delete from pear.admin``,可以把正则改成(?<=delete\\s+from\\s+?)[\w_]+\.[\w_]+?来兼容。
内容的提问来源于stack exchange,提问作者aa710
相关产品推荐
相关产品推荐

