RegEx用于T-SQL脚本中的声明变量

时间:2014-02-03 19:03:48

标签: c# regex

我想在SQL脚本中创建所有声明参数的列表。示例:给出脚本

declare @a int, @b numeric(1,2)
        ,@c varchar(20)

select @x foo, @y bar

我希望匹配@a@b@c,而不是@x@y。我找到了一个解决方案here,但它也匹配@y(这是一个未声明的参数)。提到的解决方案是:

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

我必须修改它,因为它与,@b不匹配。但是,如何在声明结束时使正则表达式停止?这是,当一个类型定义[\w()]+后跟一些空格(没有换行符)后面跟着和EOL?

我只是不明白。啊,RegEx方言是'C#'。

1 个答案:

答案 0 :(得分:1)

我修改了你的正则表达式,以便能够使用\G锚:

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

\G将匹配字符串的开头(您可能不会特别想要这里,所以我使用(?!^)来防止)或者匹配结束的地方(这就是我们需要!)。

我修改了type捕获组以匹配更合适的类型:

(?<type>\w+(?:\([^)]*\))?))

您需要MULTILINE选项处于有效状态(或在正则表达式的开头添加(?m))。

regex101 demo