Ruby Regexp匹配重复的匹配值

时间:2015-12-08 15:09:56

标签: ruby regex

我遇到了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

1 个答案:

答案 0 :(得分:2)

你的主要问题是第二次轮换中的.*部分,默认情况下,正则表达式是贪婪的并且尽可能匹配。

您可以通过在重复运算符后添加?将其变为懒惰或不合格。

因此,如果没有什么改变,那就可以了:

(@p[0-9]+)\s+=\s+(\d+|N'.+?'$|NULL)

Rubular example

你对空格的描述有些未知,我使用+作为重复运算符,假设=符号周围至少有1个存在,就像在单引号中一样,我假设它们是从来没有空如果它们是可选的,请替换*