【问题标题】:Regular expression to match T-SQL variable declarations匹配 T-SQL 变量声明的正则表达式
【发布时间】:2010-11-09 15:35:08
【问题描述】:

是否可以使用正则表达式匹配declare 语句之后的所有 T-SQL 变量名称?

在下面,我想匹配Var1Var2Var3。我不想匹配以后对这些变量的引用。

declare
    @Var1 datetime,
    @Var2 int,
    @Var3 varchar(max)

我已经使用 RegexBuddy 进行了一段时间的研究,但似乎无法正确处理。我开始怀疑这是否可能。

编辑

这是我到目前为止所得到的。它只匹配第一个变量。我不知道如何匹配后续的。

(?i:declare)\s+
(?:@([\w@$#]+)\s+(?:bigint|int|smallint|tinyint
|(?:(?:decimal|numeric)(?:\s*\(\s*\d+(?:\s*,\s*\d+)\s*\))?)
|money|smallmoney
|(?:(?:float|datetime2|datetimeoffset|time|char|varchar|nchar
|nvarchar|binary|varbinary)(?:\s*\(\s*\d+\s*\))?)
|real|date|smalldatetime|datetime|text|ntext|image
|uniqueidentifier|xml))

【问题讨论】:

    标签: c# .net regex


    【解决方案1】:

    这是我想出的,我稍微简化了一下(去掉了所有特定的数据类型),但您可以按照自己的喜好进行修复:

    (?i:declare|,)\s+?(?:(?<var>@[\w@$#]+)\s+(?<type>[\w()]+))+
    

    关键是第一部分,您要查找关键字“declare”或“,”,这些将成为您的分隔符。现在从技术上讲,这意味着它也可以匹配这样的东西:

    @var1 int,
    @var2 int,
    @var3 int
    

    但由于无论如何这都是无效的 T-SQL,我放弃了。

    【讨论】:

    • 这不是原始问题的一部分,但我做了一些更改,因此它匹配具有多个“参数”的类型 - 例如:decimal(9,2) - 你的不做。 (?i:declare|,)\s+(?:(?:@(?&lt;var&gt;[\w@$#]+))\s+(?&lt;type&gt;\w+(?:\s*\([^)]+\))?))+
    • 不错的补充,我没想到!
    • 我认为它会起作用,但它也匹配 select @foo bar, @bar foo(选择中的别名)
    猜你喜欢
    • 2019-08-09
    • 2015-07-06
    • 1970-01-01
    • 2010-09-09
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    相关资源
    最近更新 更多