我遇到了Ruby Regexp匹配的一些问题。
我有以下查询,我想扫描我的参数:
EXEC sp_executesql N'exec dbo.MyProcedure @UserID=@p0,@Products=@p1,@CountryCodes=@p2'
, N'@p0 int,@p1 nvarchar(max) ,@p2 nvarchar(max)'
, @p0 = 123569
, @p1 = N'1633,1634'
, @p2 = N'39A,CS,DE,ES,FR,GB,IT,NL,AB,BS,BU,CR,ET,FI,HU,LA,LT,MD,ME,MV,PL,RO,RS,SK,SV,GR,PT,TR,AT,CH,LI,GG,KS,UK,GI,MN,RR,CY,MT,BL,RU,DK,NO,SE,BE,IC,IE,LX'
我只是将格式化的查询看起来整洁可读。在我的源代码中,标签和空格较少。
理想情况下,我想获得三场比赛:
@p0 = 123569
@p1 = N'1633,1634'
@p2 = N'39A,CS,DE,ES,FR,GB,IT,NL,AB,BS,BU,CR,ET,FI,HU,LA,LT,MD,ME,MV,PL,RO,RS,SK,SV,GR,PT,TR,AT,CH,LI,GG,KS,UK,GI,MN,RR,CY,MT,BL,RU,DK,NO,SE,BE,IC,IE,LX'
然而,我的Regexp模式合并了@ p1和@ p2,这就是我得到的:
@p0 = 123569
@p1 = N'1633,1634',@p2 = N'39A,CS,DE,ES,FR,GB,IT,NL,AB,BS,BU,CR,ET,FI,HU,LA,LT,MD,ME,MV,PL,RO,RS,SK,SV,GR,PT,TR,AT,CH,LI,GG,KS,UK,GI,MN,RR,CY,MT,BL,RU,DK,NO,SE,BE,IC,IE,LX'
我可以看到问题所在,不过我对Regexp很新,我无法弄清楚如何正确编写它。这是我的表达:
(\@p[0-9]+)+\=(\N\'.*\'|[0-9]+|NULL)
我在这里测试我的正则表达式:http://rubular.com/r/OF5EVD5Nau
答案 0 :(得分:2)
你的主要问题是第二次轮换中的.*
部分,默认情况下,正则表达式是贪婪的并且尽可能匹配。
您可以通过在重复运算符后添加?
将其变为懒惰或不合格。
因此,如果没有什么改变,那就可以了:
(@p[0-9]+)\s+=\s+(\d+|N'.+?'$|NULL)
你对空格的描述有些未知,我使用+
作为重复运算符,假设=
符号周围至少有1个存在,就像在单引号中一样,我假设它们是从来没有空如果它们是可选的,请替换*
。