2016-04-22 40 views
0

私はGRANT文を抽出するための正規表現を作成しようとしています。私はgrant文​​を抽出するために".*(grant\s+.*?to\s+\[?[A-Za-z_]+\]?)\s.*"正規表現を使用しています文字列から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 

それだけで私に最初のマッチを与える:I

サンプル文字列は以下の通りです。

C#コード私は、すべての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); 

のために使用しています。

+0

それをUser_grpするには、コードを使用する必要がありますあなたのパターンではなく、使用している正規表現エンジンに依存します。正規表現の実行に使用するコードを追加してください。ありがとう! – cxw

+0

マッチの境界は何ですか? 'var res = Regex.Matches(input、@"(?mis)^(\ s +。*?を\ s + \ [?[A-Za-z _] +)?) ")'にしてみてください。 –

答えて

0
  1. あなたは、私はあなたのgrant文​​のために良い正規表現が何であるかを知らないあなたはリテラル\s

\r\nを交換RegexOptions.IgnoreCase | RegexOptions.Singlelineの代わりに使用する必要がありますすべての一致

  • を取得するためにRegex.Matchesを使用する必要がありますが、それは、grant文​​の完全な構文に依存

    EDIT

    あなたの正規表現は複数のマッチングには適していません。

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

    の下Thsiはまだ[DBO] ON

    GRANT EXECUTEを

    のGRANT OPTIONのような文が一致しますように。[DeleteLkpDataSp]実際

  • 関連する問題