如何用RegEx匹配CREATE TABLE语句左括号前的库、Schema及表名
要精准提取CREATE TABLE语句中第一个左括号前的库、Schema、表名组合,你可以用以下正则表达式,它会跳过可选的IF NOT EXISTS前缀,只捕获到第一个(之前的标识符部分:
^CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?([\w.]+)\s*\(
正则拆解
^CREATE\s+TABLE\s+:匹配语句开头的CREATE TABLE,\s+适配任意数量的空格(包括换行)(?:IF\s+NOT\s+EXISTS\s+)?:可选匹配IF NOT EXISTS前缀,(?:...)是非捕获组,不会把这部分内容纳入结果([\w.]+):核心捕获组,匹配由字母、数字、下划线和点组成的多级标识符(支持任意层级的库/Schema/表结构)\s*\(:匹配第一个左括号前的任意空格,确保只截止到列定义的起始位置
使用示例
假设你有以下SQL语句:
- 三级结构(库+Schema+表)
CREATE TABLE my_db.order_schema.user_order (order_id INT, user_id VARCHAR(32));
捕获组1结果:my_db.order_schema.user_order,按.拆分后得到数据库名my_db、Schema名order_schema、表名user_order
- 两级结构(Schema+表)
CREATE TABLE product_schema.product_info (id INT, name VARCHAR(100));
捕获组1结果:product_schema.product_info,拆分后得到Schema名product_schema、表名product_info
- 单表名
CREATE TABLE temp_log (log_id INT, content TEXT);
捕获组1结果:temp_log,直接为表名
- 带
IF NOT EXISTS的语句
CREATE TABLE IF NOT EXISTS analytics_db.report_schema.daily_report (date DATE, views INT);
捕获组1结果:analytics_db.report_schema.daily_report
特殊场景适配(可选)
如果你的SQL中有用反引号(MySQL)或双引号(PostgreSQL)包裹的标识符(比如含特殊字符的名称),可以用下面的正则兼容这种情况:
^CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?((?:`[^`]+`|"[^"]+"|[\w.])+)\s*\(
它会匹配带引号的标识符,同时兼容普通的字母数字下划线结构。
内容的提问来源于stack exchange,提问作者Frank

