正则表达式匹配CREATE TABLE - 超时问题

时间:2015-07-27 22:41:36

标签: regex tsql notepad++

我在使用正则表达式方面遇到了问题我是专门为处理从SQL Server 2012到2008年的迁移而开发的。如果您之前已完成此过程,则表示您可以&#39 ; t使用SSIS复制Timestamp列,否则您将收到错误消息。为了解决这个问题,我开发了一个正则表达式来注释掉目标数据库的所有时间戳列,然后SSIS工作正常。

现在我正在尝试开发一个正则表达式,将所有时间戳列收集到一个脚本中,以便我可以添加之前遗漏的所有缺失列(超过200个)。以下是文件中的示例代码:

/****** Object:  Table [dbo].[PNotice]    Script Date: 7/27/2015 10:30:32 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[PNotice](
    [NoticeID] [int] NOT NULL,
    [NoticeText] [varchar](max) NOT NULL,
--  [TimeStamp] [timestamp] NOT NULL,
 CONSTRAINT [PK_PNotice_NoticeID] PRIMARY KEY CLUSTERED 
(
    [NoticeID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO

/****** Object:  Table [dbo].[UpdateType]    Script Date: 7/27/2015 10:30:32 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[UpdateType](
    [ItemType] [int] NOT NULL,
    [ItemDescripton] [varchar](50) NULL
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO

此示例文件显示两个表,一个表带有时间戳列,另一个表没有。所以我编写了一个正则表达式来匹配整个CREATE TABLE子句,仅适用于带有注释时间戳列的表。正则表达式似乎工作了一段时间,然后在主脚本中的某个点它突然匹配整个文件,好像它超时或达到一些内部限制:

展开:

^CREATE TABLE ([^(]+)\(
(?:
  [^-()]|\n|
  (?:
    \(
    (?:
      [^()]|\n
    )+
    \)
  )
)+
--\s+\[([^\]]+)\] \[timestamp\]
(?:
  [^-()]|\n|
  (?:
    \(
    (?:
      [^()]|\n
    )+
    \)
  )
)+
\) ON \[PRIMARY\](?: TEXTIMAGE_ON \[PRIMARY\])?$

单一表达:

^CREATE TABLE ([^(]+)\((?:[^-()]|\n|(?:\((?:[^()]|\n)+\)))+--\s+\[([^\]]+)\] \[timestamp\](?:[^-()]|\n|(?:\((?:[^()]|\n)+\)))+\) ON \[PRIMARY\](?: TEXTIMAGE_ON \[PRIMARY\])?$

我们的想法是找到CREATE TABLE,然后找到表名,然后找到所有内容,直到找到最后的右括号。由于CREATE TABLE子句中经常存在带括号的子表达式,因此我加入了处理。最后,我想确保时间戳列存在,因此我复制了我的整个匹配表达式,以便在timestamp列之前和之后匹配内容。

以下是一个在线示例,演示了它的工作原理:http://regexr.com/3bfns。这个最终版本效果很好......直到在文件中的某个时刻它才会爆炸而没有任何解释。以下是另一个演示问题的SQL示例:http://pastebin.com/JtGh6tfM。 (警告:如果您尝试将其粘贴到regexr测试器中,它可能会锁定您的浏览器。在Notepad ++中尝试查看我正在讨论的问题,它运行大约10秒,然后只是突出显示整个文件)。 / p>

我不确定我的正则表达式是否太复杂,或者NotePad ++正则表达式匹配器是否内置了一些超时,或者我的正则表达式中是否存在某些错误?如何才能使它更高效,以便它可以处理一个非常大的文件,而不会出现这样的问题?

1 个答案:

答案 0 :(得分:0)

如果我理解你,你只需要表名和时间戳。我削减了你自己的正则表达式,并对其进行了一些修改。尝试这个,让我知道如果这个也冻结或运行良好。

^CREATE TABLE ([^(]+)\([^\-]+--\s+\[([^\]]+)(?=\] \[timestamp\])

https://regex101.com/r/nD0iK5/1