2017-08-31 70 views
0

我試圖提取一段文本之間的文本塊,但未能這樣做。提取模式文本之間的文本塊

文本塊看起來是這樣的

!################################################################################################### 
!# Approved : YES 
!# REASON: sample reason 
!# DEVICE: device1 
!# ACL: Acl_sample 

access-list <Rule No> extended permMuramat esp <IPaddress> <subnet mask> <IPaddress> <subnet mask> eq <Port Number> 
access-list <Rule No> extended permMuramat udp <IPaddress> <subnet mask> <IPaddress> <subnet mask> eq <Port Number> 

!########################################################################## 
!# REASON:test 
!# DEVICE: RTP 
!# SECTION : Foundational 

access-list <Rule No> permMuramat tcp <IPaddress> <subnet mask> <IPaddress> <subnet mask> eq <Port Number> 
!###################################################################################################### 
!# APPROVED : YES 
!# REASON: test1xxx 
!# DEVICE: xxx test1 Devices 
!# SECTION: test1 
!# REQUESTER: [email protected] 
!# Exp. Date : 8/2016 

    access-list <Rule No> permMuramat tcp <IPaddress> <subnet mask> <IPaddress> <subnet mask> eq <Port Number> 
access-list <Rule No> permMuramat <IPaddress> <subnet mask> <IPaddress> <subnet mask> eq <Port Number> 

基本上搞定一切到一個數組列表。

我試圖遵循一個模式,其中起始索引將以「!#」開頭,​​下一個字符不是「#」,那麼這將成爲「Startindex」,結束索引將是if下一個字符以「!」開頭並且前面的字符至少有兩個「#」。

失敗草草收場,雖然:(

的文件基本上是一個RTF文件。這是我的代碼如下現在。

string path = @"\\WDMYCLOUD\Public\data.rtf"; 

      string rtfText = File.ReadAllText(path); 

      RichTextBox rtBox = new RichTextBox { Rtf = rtfText }; 

      var plainText = rtBox.Text; 

      var charArr = plainText.ToCharArray(); 

      var arrBuffer = new ArrayList(); 

      string tmp = ""; 

      for (int i = 0; i < charArr.Length; i++) 
      { 
       int bufferIndex; 

       var startIndex = bufferIndex = i; 

       if (charArr[startIndex] == '!' && charArr[startIndex + 1] == '#' && 
        charArr[startIndex + 2] != '#' && charArr[startIndex + 2] != ' ') 
       { 
        for (int j = bufferIndex; j < charArr.Length; j++) 
        { 
         if (charArr[j] == '!' && charArr[j + 1] == '#' && charArr[j + 2] == '#') 
         { 
          bufferIndex = j + 2; 

          for (int charStartIndex = startIndex; charStartIndex <= bufferIndex; charStartIndex++) 
          { 
           tmp = tmp + charArr[charStartIndex]; 
          } 
          arrBuffer.Add(tmp); 
          tmp = ""; 
         } 
         arrBuffer.Add(tmp); 
         tmp = ""; 
        } 

       } 
      } 

我得到的所有排序混亂的數組列表,而我期待它包含的塊。

預期輸出應該是

First Block: 

    !# Approved : YES 
    !# REASON: sample reason 
    !# DEVICE: device1 
    !# ACL: Acl_sample 

    access-list <Rule No> extended permMuramat esp <IPaddress> <subnet mask> <IPaddress> <subnet mask> eq <Port Number> 
    access-list <Rule No> extended permMuramat udp <IPaddress> <subnet mask> <IPaddress> <subnet mask> eq <Port Number> 

    Second Block: 

    !# REASON:test 
    !# DEVICE: RTP 
    !# SECTION : Foundational 

    access-list <Rule No> permMuramat tcp <IPaddress> <subnet mask> <IPaddress> <subnet mask> eq <Port Number> 

    Third block: 

     !# APPROVED : YES 
    !# REASON: test1xxx 
    !# DEVICE: xxx test1 Devices 
    !# SECTION: test1 
    !# REQUESTER: [email protected] 
    !# Exp. Date : 8/2016 

     access-list <Rule No> permMuramat tcp <IPaddress> <subnet mask> <IPaddress> <subnet mask> eq <Port Number> 
    access-list <Rule No> permMuramat <IPaddress> <subnet mask> <IPaddress> <subnet mask> eq <Port Number> 

任何人都可以幫助我嗎?

+0

因此,只需刪除'!#{n}',其中'{n}'是#的數量,但如果後面跟着某個東西,則不會。 – jAC

+0

你可以使用ReadAllLines獲取一個字符串數組,並通過數組尋找!###### ........用第一個塊代替每個:,第二個塊:等 – PaulF

+1

正則表達式模式可以[字符串模式= @「^!#{2,}(?= $}」;'](https://regex101.com/r/LcGTUo/1),然後使用它的索引+長度來獲取子字符串的開始然後是下一個匹配的索引或子串尾部的整個字符串的結尾 –

回答

0

也許你可以嘗試另一種方法:

string rtfText = File.ReadAllText(path); 
List<string> loStringList = new List<string>(); 
StringBuilder loBuilder = null; 

foreach (var lsLine in Regex.Split(rtfText, Environment.NewLine)) 
{ 
    if (lsLine.StartsWith("!##")) 
    { 
     if (loBuilder != null) 
      loStringList.Add(loBuilder.ToString()); 
     loBuilder = new StringBuilder(); 
    } 
    else if (loBuilder != null) 
     loBuilder.AppendLine(lsLine); 
} 

if (loBuilder != null) 
    loStringList.Add(loBuilder.ToString()); 
+0

我認爲它只是一個#符號在他的分隔符代碼!#不!!但這是一個很好的例子 – rogue39nin

+1

好的,沒錯。但是「!##」是結束索引,也許你也可以用它作爲開始索引。因此不同的方法 – PinBack

+0

有效點;-) – rogue39nin

0

我做了類似的事情,我做的事是檢查各行,如果它含有一定的性格,你的情況「##」,如果它不」包含它,將它添加到你的字符串/列表中。

string[] lines = System.IO.File.ReadAllLines(@"[..]file.extension"); 
foreach (string line in lines) 
    if (!line.Contains("##") 
    { 
    //.. 
    } 

希望這有些幫助。