正则表达式:如何从创建表语句中识别列属性

时间:2018-10-11 11:59:30

标签: sql .net regex oracle

我想将一些表创建语句从Oracle转换为SQL Server。我采用的方法是使用正则表达式匹配选择重要的关键字。我似乎能够识别该语句中与列定义有关的部分,但是我不能完全使用正则表达式模式来满足列规范的所有可能值。我感兴趣的属性是

  • 列名
  • 列类型
  • 类型参数(如果有)
  • 默认值(如果有)
  • 不为空(如果已设置)

这是Oracle中列定义的示例集:

a1" NUMBER(10,0) CONSTRAINT "ca1" NOT NULL ENABLE, 
    "a2" NUMBER(10,0) CONSTRAINT "ca2" NOT NULL ENABLE, 
    "a3" NUMBER(14,0) DEFAULT 0 CONSTRAINT "ca3" NOT NULL ENABLE, 
    "a4" VARCHAR2(60 CHAR), 
    "a5" NUMBER(10,0), 
    "a6" NUMBER(10,0) DEFAULT 0 CONSTRAINT "ca6" NOT NULL ENABLE, 
    "a7" NUMBER(5,0) DEFAULT 0 CONSTRAINT "ca7" NOT NULL ENABLE, 
    "a8" NUMBER(5,0) DEFAULT 0 CONSTRAINT "ca8" NOT NULL ENABLE, 
    "abc" TIMESTAMP (6) DEFAULT SYSDATE NOT NULL ENABLE, 
    "def" CHAR(3 CHAR) NOT NULL ENABLE, 
    "ghi" CHAR(3 CHAR) NOT NULL ENABLE, 
    "XML" CLOB NOT NULL ENABLE, 
    "jkl" CHAR(6 CHAR), 
    "mno" NUMBER(*,0), 
    "pqr" NUMBER(*,0) DEFAULT (0) NOT NULL ENABLE, 

这是我到目前为止使用的正则表达式模式

(?i)("?)(?<colname>\w+)("?)(\s+)(?<type>\w+)((?<typepars>\((\w|\s|\,)+\))?)(\s+default\s+(?<defaultval>(null|\w|\'\s\')+?))?(\s+constraint\s+\"?\w+\"?\s+(?<nullable>not\snull)\senable)?(,?)(\s*)(?-i)

我正在使用regex101构建模式,我的目标环境是.Net。

我正在对所有感兴趣的属性使用命名组。任何帮助将不胜感激。另外,我需要很多表和列,因此我不能保证上面的示例具有完全的代表性。我只会在尝试为所有内容运行它时知道。

1 个答案:

答案 0 :(得分:0)

我个人的建议是改为查询Postgres Catalog Tables,因为他们已经以方便的方式获得了相关信息。

以下正则表达式与您拥有的SQL片段相匹配(并在某种程度上与结构相关):

  (?i)^\s*("?)(?>(?<colname>\w+))\1
   \s+
   (?:(?<type>\b\w+\b)\s*(?:\((?<typepars>(?:\w|\s|\,|\*)+)\))?)
   \s*
   (\bdefault\s+(?<defaultval>(\(?)(null|\w+|\'\s\')+?\)?))?
   \s*
   (?:(?:\bconstraint\s+(")(?<constraint_name>\w+)\9\s+)?(?<nullable>not\s+null\b)\s+enable)?
   (,?)(\s*)(?-i)$

https://regex101.com/r/GHOIcS/2