Regex: Как определить атрибуты столбца из оператора создания таблицы - PullRequest
0 голосов
/ 11 октября 2018

Я хочу перевести некоторые операторы создания таблиц из Oracle в SQL Server.Подход, который я использую, состоит в том, чтобы выбрать важные ключевые слова, используя соответствие регулярному выражению.Кажется, я могу определить ту часть утверждения, которая относится к определениям столбцов, но я не могу получить шаблон регулярного выражения, чтобы удовлетворить все возможные значения спецификации столбца.Интересующие меня атрибуты:

  • Имя столбца
  • Тип столбца
  • Параметры типа (если есть)
  • Значение по умолчанию (если есть)
  • Not Null (если установлено)

Вот примерный набор определений столбцов в 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, 

А вот шаблон регулярного выражения, который у меня такfar

(?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 голосов
/ 11 октября 2018

Моя личная рекомендация заключается в том, чтобы вместо этого запросить Таблицы каталога Postgres , так как они уже имеют соответствующую информацию удобным способом.

Следующее регулярное выражение соответствует (и несколько структурирует)У вас есть фрагменты 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...