我想在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#'。
答案 0 :(得分:1)
我修改了你的正则表达式,以便能够使用\G
锚:
(?i:declare\s+?|(?!^)\G)(?:(?<var>@[\w@$#]+)\s+(?<type>\w+(?:\([^)]*\))?))\s*(?:,\s*|$)
\G
将匹配字符串的开头(您可能不会特别想要这里,所以我使用(?!^)
来防止)或者匹配结束的地方(这就是我们需要!)。
我修改了type
捕获组以匹配更合适的类型:
(?<type>\w+(?:\([^)]*\))?))
您需要MULTILINE
选项处于有效状态(或在正则表达式的开头添加(?m)
)。