Regex для извлечения полей и типов данных из оператора SQL - PullRequest
0 голосов
/ 09 июля 2009

У меня есть это заявление SQL:

CREATE TABLE [dbo].[User]( [UserId] [int] IDENTITY(1,1) NOT NULL, 

[FirstName] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [MiddleName] 

[varchar](50) COLLATE SQL_Latin1_General_CP1_CI_A

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

Так что вернет что-то подобное:

FirstName varchar

MiddleName varchar

Примечания: Оператор sql всегда будет иметь этот формат. Я использую .Net для запуска этого регулярного выражения

Ответы [ 2 ]

1 голос
/ 09 июля 2009

Вы не упомянули, находится ли оператор SQL в строке на одной строке или он занимает несколько строк.

Предполагая, что он находится на одной строке, это может соответствовать вашему запросу:

Dim input As String = "CREATE TABLE [dbo].[User]( [UserId] [int] IDENTITY(1,1) NOT NULL, " & _
                    "[FirstName] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [MiddleName] " & _
                    "[varchar](50) COLLATE SQL_Latin1_General_CP1_CI_A"

For Each m As Match In Regex.Matches(input, "\[(?<Field>\w+)\]\s*\[(?<Type>\w+)\]")
    Console.WriteLine("{0} : {1}", m.Groups("Field").Value, m.Groups("Type").Value)
Next
0 голосов
/ 09 июля 2009

Я ничего не знаю .NET. В некоторых других мирах следующее может обрабатывать поисковую часть операции:

\[(.*?)\][\s\n\r]+\[(.*?)\]\((\d\d)\)

Вставьте это в формат "поиска" для регулярного выражения .NET (что бы это ни было), напишите свои выходные данные. Если разрыв строки может произойти в середине слова, то это может иметь проблемы. Обратите внимание, что вышеприведенное также вытягивает длину типа, так что получится

MiddleName varchar 50

Чтобы обойтись без третьей обратной ссылки, просто оставьте ее вне замены (впустую) или сделайте

\[(.*?)\][\s\n\r]+\[(.*?)\]\(\d\d\)

Много хороших способов сделать это. Как обычно, просто убедитесь, что вы понимаете потенциальную изменчивость ввода.

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