SQLite автоинкремент регулярное выражение - PullRequest
0 голосов
/ 13 июля 2009

Я принимаю запросы на создание операторов из SQLite следующим образом:

CREATE TABLE [users] ([id] INTEGER PRIMARY KEY AUTOINCREMENT, [username] VARCHAR, [password] VARCHAR, [default_project] VARCHAR) 

созданный с помощью

SELECT sql FROM sqlite_master WHERE type = 'table' AND name = :table

и определение поля автоинкремента с помощью регулярного выражения, подобного этому:

/\b\[?id\]?\s+INTEGER\s+PRIMARY\s+KEY\s+AUTOINCREMENT\b/Ui 

проблема в том, что существуют различные приемлемые способы написания ключевых слов, таких как "id", `id`, 'id'. Показано здесь http://www.sqlite.org/lang_keywords.html

Я хотел создать регулярное выражение, которое явно проверяло бы эти различные варианты ... с некоторой помощью других, к чему я пришел:

$pattern = "/\b\"(id)|(\"id\")|(\[id\])|(`id`)|('id')\"\s+INTEGER\s+PRIMARY\s+KEY\s+AUTOINCREMENT\b/Ui";

однако есть пара проблем с этим ... одна из них заключается в том, что INTEGER PRIMARY KEY AUTOINCREMENT больше не проверяется ... и что ('id') не соответствует должным образом ... однако, если бы я поменял его место с ("id") ... чем оно будет работать, а ("id") не будет.

Ответы [ 2 ]

0 голосов
/ 01 сентября 2009

[id] не соответствует [id], но только i и d, вероятно, вы ищете:

$pattern = "/\s(\"[a-z]+\"|\[[a-z]+\]|'[a-z]+'|[a-z]+)\s+INTEGER\s+PRIMARY\s+KEY\s+AUTOINCREMENT/Ui";

с использованием [a-z]+, чтобы вы могли сопоставить любое буквенное имя поля и затем найти его в первом совпадении (также обратите внимание, что могут быть строки, не использующие ключевое слово AUTOINCREMENT: они оба действительны, но немного другое значение ).

0 голосов
/ 14 июля 2009
/(\"id\"|\[id\]|\'id\'|`id`|\\bid)\s+INTEGER\s+PRIMARY\s+KEY\s+AUTOINCREMENT/Ui

, кажется, работает как задумано.

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