2013-02-19 1 views
1

업데이트 :이 질문을 쉽게 작성하십시오. 문자열을 변경 했으므로 이제는 BEGIN END에 대해 전혀 염려하지 않아도됩니다. 대신 나는 이제 종결 자로 GO 문만 있습니다. 지금DDL (create, alter, drop) DDL에서 숨겨진 DML (insert, update, delete) 문을 탐지하는 정규 표현식

내가 (CREATE, ALTER, DROP)는 DDL 스크립트에서 DELETE, INSERT, UPDATE와 같은 숨겨진 DML 문을 감지 할 수있는 정규 표현식을 작성해야 내가 다른 사람들로부터 몇 가지 답변을 얻을 바랍니다.

예. 아래 스크립트에서 2 테이블 5 문을 삭제하고 마지막 테이블 3 문을 삽입해야합니다. 그러나 실제로 저장된 proc 자체의 본문에있는 insert 문은 무시해야합니다.

여기에서 RegEx를 실행하면 http://regexr.com?33rf3으로 90 %를 달성 한 것을 알 수 있습니다. 작동하지 않는 유일한 부분은 마지막 GO 때까지 욕심 많은 경기를하고 있다는 것입니다. 첫 번째 GO에서 중지해야합니다. 나는 +를 사용해 보았는가? 연산자를 욕심이 없게 만들지 만 작동하지 않으려 고합니다.

delete table5 /*Regex should find this*/ 

GO 

create proc abc 
begin 
    insert into table1 /*Regex should IGNORE this*/ 
    begin 
     fake nesting here 
     insert into table2 /*Regex should IGNORE this*/ 
    end 
end 

GO 

delete table5 /*Regex should find this*/ 

GO 

alter proc abc2 
begin 
    --no statements in this proc 
end 

GO 

insert into table3 /*Regex should find this*/ 
+0

중첩 대괄호 (begin/end) 때문에 .NET 정규 표현식 구현 만이 경우 사용할 수있다. 또 다른 옵션은 begin/end의 중첩이 제한적이라고 가정하는 것입니다. –

+0

나는 C#을 사용하고 있습니다. 정규식은 어떤 아이디어가 생겼을까요? 또한 시작 부분이 없다는 것을 간단하게한다면 ... 그리고 모든 문장은 GO로 끝납니다 GO – StackThis

+0

당신은 틀린 나무를 짖고 있다고 생각합니다. 정규식으로 작업하게되면 놀랄 것입니다. http://stackoverflow.com/questions/133601/can-regular-expressions-be-used-to-match-nested-patterns –

답변

2

GO 문은 필요하지 않습니다.

 var regex1 = new Regex(@" 
      (?s) 
      (create|alter|drop).+? 
      begin 
      (?: 
       (?> (?! begin | end) . 
        | begin (?<counter>) 
        | end (?<-counter>) 
       )* 
      ) 
      (?(counter)(?!)) 
      end 
      " 
     , RegexOptions.IgnorePatternWhitespace 
     ); 

     var regex2 = new Regex(@"(?:insert|update|delete).+"); 

     var result = regex2.Matches(regex1.Replace(your_input, "")) 
      .Cast<Match>() 
      .Select(m => m.Value); 

이 코드는 모든 작성/변경/삭제 명령문을 삭제하고 삭제/변경/삭제를 찾습니다. 나는 그것이 하나의 정규식을 사용하여 완료 될 수 있다고 생각하지만, 지금은 미안하다고 제안 할 수있다. :)

+0

Teddy에게 감사드립니다. 나는 내일 일을하고 이것을 시도 할 때 확실히 당신을 업데이 트됩니다. 이것은 나를 위해 충분하다. 나는 지금 가장 최적의 솔루션을 찾고 있지 않습니다. 작동하는 하나가 나를위한 올바른 해결책입니다 :) – StackThis

+0

Thanks Teddy. 그것은 매력처럼 작동했습니다! – StackThis