2016-04-22 147 views
0

我正在嘗試創建一個提取GRANT語句的正則表達式。下面我從字符串中提取GRANT語句的正則表達式

樣品字符串給出:

USE MarketWorkFlowDb 
GO 
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DeleteLkpDataSp]') AND type in (N'P', N'PC')) 
    DROP PROCEDURE [dbo].[DeleteLkpDataSp] 
GO 

CREATE PROCEDURE [dbo].[DeleteLkpDataSp] 
    @pType VARCHAR (50), --function/role/region 
    @pFieldId INT, --id which is deleted 
    @pRequestTypeId INT=0 
AS 
BEGIN 
IF (@pFieldId >0) 

BEGIN 
    IF @pType='Function' 
    BEGIN 
     UPDATE LkpCategoryTb 
     SET IsDeleted=1, LastUpdatedBy='Admin', LastUpdatedDate=GETDATE() 
     WHERE [email protected] AND RequestTypeId = @pRequestTypeId 

    END 

    ELSE IF @pType='Role' 
    BEGIN 

     UPDATE LkpRoleTb 
     SET IsDeleted=1, LastUpdatedBy='Admin', LastUpdatedDate=GETDATE() 
     WHERE [email protected] AND RequestTypeId = @pRequestTypeId 
    END 

    ELSE IF @pType='Region' 
    BEGIN 
     UPDATE LkpRegionTb 
     SET IsDeleted=1, LastUpdatedBy='Admin', LastUpdatedDate=GETDATE() 
     WHERE [email protected] AND RequestTypeId = @pRequestTypeId 
     -------------------------Updates Approver Manager Table-------------------------------- 
     UPDATE RegionalPeopleTb 
     SET IsDeleted =1, LastUpdatedBy='Admin', LastUpdatedDate =GETDATE() where RegionId= @pFieldId and RequestTypeId= @pRequestTypeId 
    END 

END 
END 
GO 

GRANT EXECUTE 


ON [dbo].[DeleteLkpDataSp] TO User_grp WITH GRANT OPTION 

GRANT EXECUTE 
ON [dbo].[DeleteLkpDataSp] TO User_grp 
GO 

我使用正則表達式".*(grant\s+.*?to\s+\[?[A-Za-z_]+\]?)\s.*"提取GRANT語句,但它只是給我的第一場比賽。

我使用這個

input = File.ReadAllText(@"c:\MarketWorkFlowDB3.0\DatabaseObjects\StoredProcedures\DeleteLkpDataSp.sql"); 

      input = Regex.Replace(input, "\r\n", @"\s"); 

      Match match = Regex.Match(input, @".*(grant\s+.*?to\s+\[?[A-Za-z_]+\]?)\s.*", 
      RegexOptions.IgnoreCase); 

我怎樣才能得到所有的GRANT語句C#代碼。

+0

這實際上不依賴於你的模式,而是依賴於你正在使用的正則表達式引擎。請添加您用來運行正則表達式的代碼。謝謝! – cxw

+0

比賽的界限是什麼?嘗試'var res = Regex.Matches(input,@「(?mis)^(grant \ s +。*?to \ s + \ [?[A-Za-z _] +]?)」)'。 –

回答

0
  1. 您應該使用Regex.Matches來獲取所有匹配
  2. 您應該使用RegexOptions.IgnoreCase | RegexOptions.Singleline而不是用文字\s

更換\r\n我不知道什麼是你的GRANT語句良好的正則表達式,但這取決於授權聲明的完整語法

編輯

你的正則表達式不利於多重匹配。您應該使用類似的代碼如下

var matches = Regex.Matches(input, @"(grant\s+.*?to\s+\[?[A-Za-z_]+\]?)", RegexOptions.IgnoreCase | RegexOptions.Singleline); 

Thsi仍將匹配像

GRANT OPTION

GRANT語句EXECUTE ON [DBO]。[DeleteLkpDataSp] TO User_grp