You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle CREATE TABLE语句正则匹配:捕获含主键外键的完整语句

Oracle CREATE TABLE 语句正则捕获方案(含主键/外键约束)

核心问题分析

Oracle的CREATE TABLE语句存在括号嵌套(列定义、约束块)、约束写法灵活(内联/外联约束)的特点,普通正则因贪婪/非贪婪匹配逻辑缺陷和无法处理嵌套结构,容易出现内容截断的问题。

可行正则实现方案

在Python中,结合re.DOTALL(让.匹配换行)和递归正则(处理括号嵌套),可以实现完整匹配:

import re

# 匹配完整CREATE TABLE语句的正则表达式
create_table_pattern = re.compile(
    r'''
    ^CREATE\s+TABLE\s+(\w+)\s*  # 匹配表名部分
    \(                          # 表定义起始括号
        (?:                     # 非捕获组:匹配列与约束内容
            [^()]+              # 匹配非括号字符(列定义、约束关键字等)
            |                   # 或递归匹配嵌套括号(处理约束内的子查询、函数)
            \( (?R) \)
        )*
    \)                          # 表定义结束括号
    (?:\s+TABLESPACE\s+\w+)?    # 可选表空间定义
    (?:\s+CONSTRAINT\s+\w+\s+(?:PRIMARY|FOREIGN)\s+KEY.*?)?  # 外联主键/外键约束
    ;                           # 语句结束分号
    ''',
    re.VERBOSE | re.IGNORECASE | re.DOTALL
)

# 测试示例SQL
test_sql = """
CREATE TABLE EMPLOYEE (
    EMP_ID NUMBER(10) PRIMARY KEY,
    NAME VARCHAR2(50) NOT NULL,
    DEPT_ID NUMBER(5),
    CONSTRAINT EMP_DEPT_FK FOREIGN KEY (DEPT_ID) REFERENCES DEPARTMENT(DEPT_ID)
) TABLESPACE USERS;
"""

match_result = create_table_pattern.search(test_sql)
if match_result:
    print("捕获到的完整CREATE TABLE语句:\n", match_result.group(0))

关键特性说明

  • re.DOTALL:支持匹配多行写法的SQL语句,避免因换行导致匹配中断。
  • re.VERBOSE:允许正则表达式添加注释、换行,提升可读性。
  • 递归正则(?R):处理括号嵌套场景(比如约束中的函数表达式、子查询),解决普通正则无法深度匹配嵌套结构的问题。
  • re.IGNORECASE:兼容Oracle SQL大小写不敏感的语法特性。
  • 可选匹配段:覆盖Oracle常见的CREATE TABLE扩展写法(表空间、外联约束)。

额外提示

  • 该正则仅适配标准Oracle CREATE TABLE语法,若遇到极端自定义场景(如分区表复杂定义、带WITH子句的特殊表),需针对性调整正则规则。
  • 生产环境中,若需全面解析SQL语法,更推荐使用专业SQL解析库(如sqlparse),正则仅适合简单场景下的快速匹配需求。

内容的提问来源于stack exchange,提问作者KRStam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 01:57:40