2016-08-02 6 views
-1

우리는이 있다면 같은 일부 문자열 :정규식 GET 그룹 특정 시작과 블록과 각 그룹을 종료

----------DBVer=1 
/*some sql script*/ 
----------DBVer=1 
----------DBVer=2 
/*some sql script*/ 
----------DBVer=2 
----------DBVer=n 
/*some sql script*/ 
----------DBVer=n 

우리가 정규식 ... 등등 첫째 DBVer = 1 초 DBVer = 1 사이 스크립트를 추출 할 수 있습니다 ? DBVer = DIGITA 문자열을 선택 본다면

나는 것은 우리는 몇 가지 정규식에 대한 placehoder 및 전화 정규식 엔진이 있어야합니다 때까지 DBVer = DIGITA 다시 경우 톱 DBVer = digitB 문자열을 선택할 때까지 DBVer = digitB 등등 ...

정규 표현식으로 이것을 구현할 수 있을까요?

답변

2

예, 역 참조 및 lookarounds를 사용하여 캡처 할 수있는 스크립트 : 여기

var pattern = @"(?<=(?<m>-{10}DBVer=\d+)\r?\n).*(?=\r?\n\k<m>)"; 
var scripts = Regex.Matches(input, pattern, RegexOptions.Singleline) 
       .Cast<Match>() 
       .Select(m => m.Value); 

, 우리는 (?<m>-{10}DBVer=\d+)으로 m (마커) 그룹을 캡처과 비교할 \k<m>와 정규식에서 나중에 m 값을 재사용 끝 마커.

.*이 개행 문자와 일치하도록하려면 Singleline 모드를 사용해야합니다. 이것은 차례로, 우리가 새 라인에 대해 구체적이어야한다는 것을 의미합니다. Singleline 모드에서는 플랫폼이 아닌 특정 방법으로 \r?\n으로 계산할 수 있습니다.

0

아래 코드를 사용해보십시오. RegEx가 아니지만 잘 작동합니다.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Text.RegularExpressions; 


namespace ConsoleApplication6 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.txt"; 
     static void Main(string[] args) 
     { 

      Script.ReadScripts(FILENAME); 
     } 
    } 
    public class Script 
    { 
     enum State 
     { 
      Get_Script, 
      Read_Script 
     } 

     public static List<Script> scripts = new List<Script>(); 
     public int version { get; set; } 
     public string script { get; set; } 

     public static void ReadScripts(string filename) 
     { 
      string inputLine = ""; 
      string pattern = "DBVer=(?'version'\\d+)"; 
      State state = State.Get_Script; 
      StreamReader reader = new StreamReader(filename); 
      Script newScript = null; 
      while ((inputLine = reader.ReadLine()) != null) 
      { 
       inputLine = inputLine.Trim(); 
       if (inputLine.Length > 0) 
       { 
        switch (state) 
        { 
         case State.Get_Script : 
          if(inputLine.StartsWith("-----")) 
          { 
           newScript = new Script(); 
           scripts.Add(newScript); 
           string version = 
            Regex.Match(inputLine, pattern).Groups["version"].Value; 
           newScript.version = int.Parse(version); 
           newScript.script = ""; 
           state = State.Read_Script; 
          } 
          break; 
         case State.Read_Script : 
          if (inputLine.StartsWith("-----")) 
          { 
           state = State.Get_Script; 
          } 
          else 
          { 
           if (newScript.script.Length == 0) 
           { 
            newScript.script = inputLine; 
           } 
           else 
           { 
            newScript.script += "\n" + inputLine; 
           } 
          } 
          break; 

        } 
       } 
      } 
     } 
    } 
}