C# 正则表达式-顺序多行SQL字符串

C# 正则表达式-顺序多行SQL字符串,c#,regex,C#,Regex,给定一个字符串,例如: 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',

给定一个字符串,例如:

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

  • 提取
    查询并附加到
    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
INSERT
CREATE
单词,即可提取
ALTER
INSERT
查询。

创建
StringBuilder

使用
REGEX

  • 提取
    查询并附加到
    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
查询,只需替换
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());
和林克玩得开心

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());

你是说这是一根绳子?你需要把它吐出来,然后把“创建部分”放在上面?你是说整个这是一个字符串?你需要把它吐出来,然后把创建部件放在上面?@BlackBear它限制了效果,否则它可能会包括ALTER,插入查询…懒惰的量词…谢谢:)只研究正则表达式几个星期了:O C#简而言之,我非常喜欢它我最喜欢的2.它有一个关于正则表达式的很好的章节,但是正则表达式直到第一个括号才起作用。@blackear它限制了效果,否则它可能包括ALTER,插入查询…懒惰的量词…谢谢:)只研究正则表达式几个星期了:O C#简而言之,我非常喜欢它我最喜欢的2.它有一个关于正则表达式的很好的章节,但是正则表达式直到第一个括号才起作用。尽管当创建之间没有空间时,它不能正常工作,插入,ALTER语句。@Anirudha是的,它取决于sql字符串的格式。大概Regex.Split可以被修改成任何用于分隔语句的格式。我的1很简单,但它对几乎任何格式都有很好的容忍度。:)谢谢,我更喜欢这种方式。我做了一个小的修改以确保换行符是一致的。我用空格替换了每一个换行符/回车符,然后使用以下正则表达式Regex.Replace(sql)(“+string.Join(“|”,statementOrder)+“,”\n\r$1”)在每种语句类型(CREATE、ALTER等)前面添加了换行符。尽管在CREATE、INSERT和,ALTER语句。@Anirudha是的,它取决于sql字符串的格式。大概Regex.Split可以被修改成任何用于分隔语句的格式。我的1很简单,但它对几乎任何格式都有很好的容忍度。:)谢谢,我更喜欢这种方式。我做了一个小的修改以确保换行符是一致的。我用一个空格替换了每一个换行符/回车符,然后使用以下正则表达式Regex.Replace(sql)(“+string.Join(“|”,statementOrder)+”,“\n\r$1”)在每种语句类型(CREATE、ALTER等)前面添加了一个换行符。