2016-04-07 8 views
2

In C#, ich versuche, einen regulären Ausdruck zu schreiben, die alle go-Anweisungen finden, die die einzige Anweisung in der Zeile sind, und nicht unmittelbar von einer use $(trop)-Anweisung vorangestellt.Nicht-gierige negative Lookbehind

Ich bin ziemlich nah - es findet alle go Aussagen, aber ich bin nicht in der Lage, es richtig zu machen - es ist das Finden der ersten (wie unten mit "Fange das nicht"), aber ich kann nicht Machen Sie das negative Lookbehind richtig funktionieren. Kann mir jemand helfen, was ich falsch mache?

(?<goStatement>^(\s{0,})go(\s{0,})$)(?<useTrop>(?<!(^\s{0,}use \(trop\)\s{0,}$)))` 

Hier ist der Text, den ich bin auf der Suche:

set noexec off 
:setvar trop devtip 
:setvar trop_wf_tracking trop_workflow_tracking 
:setvar trop_wf trop_wf 

-- Information - to set this script to only run once change stop_if_applied to 1. 
:setvar stop_if_applied 1 


-- Do NOT catch this one 
use $(trop) 
go 



if $(stop_if_applied) = 1 and exists (select * from $(trop).dbo.DATABASE_VERSION where DB_SCRIPT_NUMBER = 20656) begin 
    select 'This db script has already been run. If it is required to run again change the variable stop_if_applied to 0. Disabling all further commands on the connection.' 
      ,* from $(trop).dbo.DATABASE_VERSION 
    where DB_SCRIPT_NUMBER = 20656 

    set noexec on 
    return 
end 

-- DO catch this one ---------- 
go 
-- ------------------------------------------------------------------------------ 

set xact_abort on 

begin transaction 

select * from $(trop).dbo.DATABASE_VERSION where DB_SCRIPT_NUMBER = 20656; 

/* Insert your code here */ 

select * from dbo.SECURITY_RIGHT 
-- DO catch this one ---------- 
go 

/* End of your code here */ 
-- DO catch this one ---------- 
go 

if not exists (select * from $(trop).dbo.DATABASE_VERSION where DB_SCRIPT_NUMBER = 20656) 
    insert into $(trop).dbo.DATABASE_VERSION (DB_SCRIPT_NUMBER, COMMENT) 
    values (20656, 'comment goes here'); 

select * from $(trop).dbo.DATABASE_VERSION where DB_SCRIPT_NUMBER = 20656; 

commit 
+1

Nichts von dem was Sie hier haben, ist 'C#', es sieht aus wie SQL Server T-SQL. Wenn es sich bei Ihrer Frage um reguläre Ausdrücke handelt, würde ich den Beitrag mit "regex" kennzeichnen, um eine höhere Chance zu haben, die benötigte Hilfe zu erhalten. – gmiley

+0

Es ist auch nicht erforderlich, die Sprache im Betreff anzugeben. Sie sollten dies überprüfen: http://stackoverflow.com/help/how-to-ask –

+0

Jungs, ich glaube nicht, dass dies sein Code ist. Ich denke, das ist das Beispiel, das er zu analysieren versucht. – Icemanind

Antwort

1

Ja, der Lookbehind sollte vor dem ^go gehen.

(?m)        # Multi-line mode 
(?<! use \s* \$\(trop\) \s*)  # Not a 'use $(trop)` behind 
^         # Beginning of line 
\s* go       # The 'go' 
[^\S\r\n]*      # Optional horizontal whitespace 
(?= \r? \n | $)     # until the end of line or EOS 

C# test

Regex RxGo = new Regex(@"(?m)(?<!use\s*\$\(trop\)\s*)^\s*go[^\S\r\n]*(?=\r?\n|$)"); 
Match matchGo = RxGo.Match(sTarget); 
while (matchGo.Success) 
{ 
    Console.WriteLine("'{0}'", matchGo.Value); 
    matchGo = matchGo.NextMatch(); 
} 
+0

Danke! Das hat den Trick. –

0

Sie sollten diese in der Lage sein zu verwenden:

(?<!(use \$\(trop\)[\r\n]))^go$ 

Dies funktioniert in Ihrem Beispiel, zumindest.

+0

Danke - aber dieses hat nicht funktioniert in C# ... :( –