2015-12-08 94 views
0

我正面臨與Ruby Regexp匹配的一些問題。Ruby Regexp匹配匹配重複值

我有以下查詢,我想我的掃描參數:

EXEC sp_executesql N'exec dbo.MyProcedure @[email protected],@[email protected],@[email protected]' 
    , 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' 

然而,我的正則表達式模式合併@ 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

回答

2

您的主要問題是在第二交替的.*一部分,默認情況下正則表達式是貪婪和匹配儘可能多的。

您可以通過在重複運算符後面添加?將其變爲懶惰或不真實。

所以變化不大,這將做到:

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

Rubular example

有從你描述的空間一些不知名的,我以前+的重複操作符假設會有至少1圍繞本=符號,就像在單引號中一樣,我認爲它們從不是空的。如果是單項選擇,請換成*

+1

我剛剛意識到我粘貼了錯誤的URL。但是,這似乎正是我正在尋找的。非常感謝你。 –

+1

我已經用正確的鏈接更新了我的答案。我對錶達式做了一些修改,並刪除了'$'字符(我的整個文本都是整行),它似乎工作正常。這是一個:'(@p [0-9] +)=(\ d + | N'。+?'| NULL)'。再次感謝 –

+1

@EvaldasBuinauskas當我在你的正則表達式中看到你的例子時,我擔心的一件事是:p我認爲我們現在可以把它保留下來,很高興它幫助了:) – Tensibai