2016-04-07 2 views
2

В C# я пытаюсь написать регулярное выражение, которое найдет все операторы go, которые являются единственным оператором в строке, а не сразу предшествует оператору use $(trop).Non-greedy negative lookbehind

Я довольно близко - нахожу все операторы go, но я не могу это исправить - это поиск первого (как указано ниже «НЕ поймать этот»), но я не могу сделайте отрицательный lookbehind работать правильно. Может ли кто-нибудь помочь мне с тем, что я делаю неправильно?

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

Вот текст Я ищу:

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

Никто из того, что у вас есть здесь '' C#, это выглядит как SQL Server T-SQL. Кроме того, если ваш вопрос касается регулярных выражений, я бы пометил сообщение с 'regex', чтобы иметь более высокий шанс получить необходимую вам помощь. – gmiley

+0

Также нет необходимости указывать язык в теме. Вы должны это проверить: http://stackoverflow.com/help/how-to-ask –

+0

Ребята, я не думаю, что это его код. Я думаю, что это пример, который он пытается разобрать. – Icemanind

ответ

1

Да, смотровое окно должно идти до ^go.

(?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# тест

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

Спасибо! Это сделал трюк. –

0

Вы должны быть в состоянии использовать это:

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

Это работает в вашем примере, по крайней мере.

+0

Спасибо, но этот не работал в C# ... :( –

Смежные вопросы