2016-08-16 19 views
-2

我想通過html div標記分割文章的正文,所以我有一個模式來搜索div。 的問題是,該圖案也分割\ r \ n [此處輸入圖像的描述] [1]爲什麼正則表達式分割添加到模式 r n

string pattern = @"<div[^<>]*>(.*?)</div>"; 
string[] bodyParagraphsnew = Regex.Split(body, pattern,RegexOptions.None); 
Response.Write("num of paragraph =" + bodyParagraphsnew.Length); 
for (int i = 0; i < bodyParagraphsnew.Length; i++) 
{ 
    Response.Write("bodyParagraphs" + i + "= " + bodyParagraphsnew[i]+ Environment.NewLine); 
} 

當調試這個代碼我陣列bodyParagraphsnew中看到很多的「\ r \ n」個。

它看到模式包括字符串拆分「\ r \ n」 我嘗試將\ r \ n替換爲空字符串,我希望bodyParagraphsnew長度會改變。但不是。在數組中)包含\ r \ n它包含「」 爲什麼?

這裏是鏈接到的圖像http://i.stack.imgur.com/Hxqki.gif解釋問題

+2

你在一個可以向我們展示導致此問題的身體字符串的示例嗎? –

回答

2

你們看到的是第一</div>標記的結束和下一個< div>標籤的開始之間的文本。這是Split所做的,它發現之間的正則表達式匹配的文本

這裏有什麼好奇的是,您還將在開放標籤和關閉標籤之間獲取文本,因爲您的字符串中包含的括號形成capturing group。考慮下面的程序:

using System; 
using System.Text.RegularExpressions; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     string body = "<div>some text</div>\r\n<div>some more text</div>"; 

     string pattern = @"<div[^>]*?>(.*?)</div>"; 
     string[] bodyParagraphsnew = Regex.Split(body, pattern, RegexOptions.None); 
     Console.WriteLine("num of paragraph =" + bodyParagraphsnew.Length); 
     for (int i = 0; i < bodyParagraphsnew.Length; i++) 
     { 
      Console.WriteLine("bodyParagraphs {0}: '{1}'", i, bodyParagraphsnew[i]); 
     } 
    } 
} 

什麼你會得到這樣的:

  1. 「」 - 從第一< DIV>之前採取的一個空字符串。
  2. 「某些文字」 - 由於捕獲組,第一個< div>的內容。
  3. 「\ r \ n」 - 第一個</div>和上一個< div>的開始之間的文本。
  4. 「更多文本」 - 第二個div的內容,也是因爲捕獲組。
  5. 「」 - 取自最後一個</div>後的空字符串。

你可能以後是div標籤的內容。這可以樣的使用此代碼來實現:

​​

不過請注意,在HTML中,div標籤可以嵌套在彼此內。例如,下面是一個有效的HTML字符串:

string test = "<div>Outer div<div>inner div</div>outer div again</div>"; 

隨着這種局面正則表達式是行不通的!這主要是由於HTML不是Regular Language。爲了處理這種情況,你需要編寫一個解析器(其中正則表達式只是一小部分)。然而,我個人不會打擾,因爲有很多開源的HTML解析器已經可用,例如HTML Agility Pack

0

兩個possibilies

  1. 您使用的不是陣列LLIST和list.remove
  2. 你通過你的陣列搜索\ r \ n和由指標

    if(bodyParagraphsnew[i] == "\r\n") 
    { 
    bodyParagraphsnew = bodyParagraphsnew.Where(w => w != bodyParagraphsnew[i]).ToArray(); 
    } 
    
刪除

不怎麼樣,但也許這就是你要找的