代码之家  ›  专栏  ›  技术社区  ›  Chechy Levas

Regex:如何从createtable语句中识别列属性

  •  0
  • Chechy Levas  · 技术社区  · 7 年前

    • 列名
    • 列类型
    • 类型参数(如有)
    • 默认值(如果有)

    以下是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 回复  |  直到 7 年前
        1
  •  0
  •   Corion    7 年前

    我个人的建议是询问 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