Я думаю, вы пытаетесь сделать слишком много за один go. Вы не создадите удобочитаемую программу, пытаясь поместить все это в одну строку. Для ваших столбцов spe c, может упростить регулярное выражение, чтобы просто искать вхождения всей группы, которая делает объявление вашего столбца:
[a-z]+ (bool|int)( primary)?
Будет соответствовать 3 раза:
x (cola bool, colb int, colc int primary)
^^^^^^^^^ ^^^^^^^^ ^^^^^^^^^^^^^^^^
Ваш движок регулярных выражений теперь будет иметь коллекцию совпадений из 3 совпадений (а не одно совпадение с 3 группами захвата), то есть все биты столбцов. при условии, что ваше объявление имени столбца, типа, модификаторов, запятой согласовано, вы должны использовать это для извлечения информации о вашем столбце. Вместо того, чтобы пытаться создать для этого одно массивное регулярное выражение, выберите простой, который будет постоянно повторять столбец spe c, как я это делал здесь, и запустите другое регулярное выражение, чтобы вытащить имя таблицы