[英]Regex - Order Multiline SQL String
给定一个字符串,例如:
CREATE TABLE [dbo].[Table1] (
[Id] [int] NOT NULL,
[Title] [nvarchar](255) NULL
)
ALTER TABLE [dbo].[Table1] ADD
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED ([Id])
INSERT INTO [dbo].[Table1] ([Id], [Title]) VALUES ('Home', NULL)
CREATE TABLE [dbo].[Table2] (
[Id] [int] NOT NULL,
[Title] [nvarchar](255) NULL
)
...
我将如何对语句进行排序,以使CREATE TABLE位在顶部。 我猜我将不得不使用正则表达式,但是我不确定从那里去哪里。
非常感谢您的帮助。 谢谢
创建一个StringBuilder
使用正则REGEX
TABLE
查询并追加到StringBuilder
INSERT
查询并追加到StringBuilder
ALTER
查询并追加到StringBuilder
例如,您可以使用以下正则表达式提取Create
查询:
Regex r = new Regex(@"CREATE .*?(?=(ALTER|INSERT|\z))", RegexOptions.Singleline|RegexOptions.IgnoreCase);
r.Match("CREATE TABLE [dbo]............");
类似地,您只需替换上述正则表达式中的ALTER
, INSERT
, CREATE
字即可提取ALTER
, INSERT
查询。
与LINQ一起玩。
var sql = @"CREATE TABLE [dbo].[Table1] (
[Id] [int] NOT NULL,
[Title] [nvarchar](255) NULL
)
ALTER TABLE [dbo].[Table1] ADD
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED ([Id])
INSERT INTO [dbo].[Table1] ([Id], [Title]) VALUES ('Home', NULL)
CREATE TABLE [dbo].[Table2] (
[Id] [int] NOT NULL,
[Title] [nvarchar](255) NULL
)
";
var statementOrder = new[] { "CREATE", "ALTER", "INSERT" };
var statements = from statement in Regex.Split(sql, "\n\r")
let trimStatement = statement.Trim()
let statementType = trimStatement.Substring(0, trimStatement.IndexOf(' '))
orderby Array.IndexOf(statementOrder, statementType)
select trimStatement;
var newSql = String.Join("\n\r", statements.ToArray());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.