2016-04-22 6 views
0

Ich versuche, eine Regex zum Extrahieren von GRANT-Anweisung zu erstellen. IchRegex zum Extrahieren von GRANT-Anweisungen aus Zeichenfolge

Beispiel Zeichenfolge ist unten angegeben:

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 ".*(grant\s+.*?to\s+\[?[A-Za-z_]+\]?)\s.*" Regex bin mit der GRANT-Anweisung zu extrahieren, aber es gibt mir nur das erste Spiel.

C# -Code ich verwende für dieses

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); 

Wie ich alle GRANT-Anweisungen zu erhalten.

+0

, die tatsächlich TO User_grp hängt nicht von Ihrem Muster ab, sondern von der von Ihnen verwendeten Regex-Engine. Fügen Sie den Code hinzu, mit dem Sie die Regex ausführen. Vielen Dank! – cxw

+0

Was sind die Grenzen für das Spiel? Probieren Sie 'var res = Regex.Matches (Eingabe, @" (? Mis)^(grant \ s +. *? Bis \ s + \ [? [A-Za-z _] +]?) ")'. –

Antwort

0
  1. sollten Sie Regex.Matches benutzen Sie alle Spiele
  2. Sie RegexOptions.IgnoreCase | RegexOptions.Singleline statt \r\n mit wörtlichen \s ersetzen

verwenden soll, weiß ich nicht, was eine gute Regex für Ihre Grant-Anweisung ist, aber Das hängt von der vollständigen Syntax einer Gewährungsaussage ab.

EDIT

Ihr regulärer Ausdruck ist für mehrere Übereinstimmungen nicht förderlich. Sie sollten Code wie verwenden unten

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

Thsi noch Aussagen übereinstimmen werden wie

GRANT OPTION

GRANT EXECUTE ON [dbo]. [DeleteLkpDataSp]