2016-08-02 42 views
-1

如果我們有一些字符串,如:正則表達式獲取組塊,並最終各組

----------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等之間的腳本...用正則表達式?

我一點我們必須有一些placehoder的正則表達式,並電話正則表達式引擎,如果看到DBVer = DIGITA挑弦,直到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(標記)組(?<m>-{10}DBVer=\d+)和正則表達式與\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; 

        } 
       } 
      } 
     } 
    } 
}