从含换行/回车的SQL字符串中提取数据库表名的正则问题
问题解决:Perl正则正确提取SQL表名
错误原因分析
原正则/ INTO (\S+?\.\S+?)[\s\n\r()]/gi存在两个核心问题:
- 匹配模式
\S+?\.\S+?仅能匹配含一个点的表名,但目标表名DWH_CCP.TGT.CCP_ATTR_XREF包含两个点,导致正则无法匹配完整表名,进而持续匹配后续非空白字符。 - 循环内部声明的
my $table是局部变量,循环结束后外部的$table会因作用域问题无法正确获取匹配结果。
修正后的代码
# 假设$string为存储SQL语句的变量 my $table; if ($string =~ / INTO (\S+\.\S+)[\s\n\r()]/gi) { $table = $1; } print "\ntable is $table\n";
正则规则说明
\S+\.\S+:匹配包含至少一个点的连续非空白字符,兼容库.模式.表或模式.表格式的表名。[\s\n\r()]:匹配表名后的终止符(空格、换行、回车、括号),确保匹配在表名结束位置停止。- 若需支持不带点的单表名,可将正则调整为
/ INTO (\w+(?:\.\w+)*)[\s\n\r()]/gi,其中\w+(?:\.\w+)*可匹配由字母数字下划线组成、含任意数量点的表名。
验证结果
用给定SQL语句测试修正后的代码,输出为:
table is DWH_CCP.TGT.CCP_ATTR_XREF
内容的提问来源于stack exchange,提问作者James Finnegan
相关产品推荐
相关产品推荐

