2015-09-07 30 views
-2

從下面的HTML腳本:正則表達式,如何提取分隔字符串幷包含一些特殊字詞?

<p style="line-height:0;text-align:left"> 
    <font face="Arial"> 
     <span style="font-size:10pt;line-height:15px;"> 
      <br /> 
     </span> 
    </font> 
</p> 
<p style="line-height:0;text-align:left"> 
    <font face="AR BLANCA"> 
     <span style="font-size:20pt;line-height:30px;"> 
      [designation] 
     </span> 
    </font> 
</p> 
<p style="line-height:0;text-align:left"> 
    &nbsp;&nbsp; 
</p> 

我想提取以下部分

<font face="AR BLANCA"> 
    <span style="font-size:20pt;line-height:30px;"> 
     [désignation] 
    </span> 
</font> 

我想這正則表達式:

<font.*?font> 

這可能separatly提取兩場比賽,但如何指定我想要包含[]的那個? 謝謝

+1

強制性:http://stackoverflow.com/a/1732454/2846923 –

+0

什麼語言/程序你想使用正則表達式在? –

+0

C#。我不認爲我可以找到另一種方法來解決我的問題沒有正則表達式 –

回答

-2

一般來說,你不應該使用HTML的正則表達式 - 通常有很多更好的方法來做到這一點。但是,在一些孤立的情況下,它工作得很好。假設這是其中的一種情況,下面介紹如何用正則表達式來實現。


製作的正則表達式時往往容易當你認爲它是這樣的:寫你想匹配的東西,然後用正則表達式替換其中的一部分作爲必要的。

我們想匹配

<font face="AR BLANCA"> 
    <span style="font-size:20pt;line-height:30px;"> 
     [désignation] 
    </span> 
</font> 

我們不在乎什麼face="AR BLANCA"> <span style="font-size:20pt;line-height:30px;">désignation</span>的,所以用.*替換它們。

<font .*[.*].*</font> 

我們還必須確保你逃避所有的特殊字符,否則將[.*]被誤認爲是character class

<font .*\[.*\].*</font> 

我們也想匹配所有字符,但大部分的時間.只匹配非換行字符[\S\s]是一個字符類,根據定義匹配全部個字符。

<font [\S\s]*\[[\S\s]*\][\S\s]*</font> 

我們終於有了最後一個問題,這個表達式將匹配從最初<font到最後</font>。用你的HTML例子,讓量詞懶惰不會有幫助,所以我們需要做別的事情。我所知道的最好的方法是使用here解釋的技巧。所以我們用((?!</?font)[\S\s])*替換[\S\s]*的每個實例。

<font ((?!</?font)[\S\s])*\[((?!</?font)[\S\s])*\]((?!</?font)[\S\s])*</font> 

Here's an online demonstration of this regex.

+0

完美工作。謝謝Hat先生:) –

0

Html Agility Pack方式:

using HtmlAgilityPack; 
... 

string htmlText = @"<p style=""line-height:0;text-align:left""> 
..."; 

HtmlDocument html = new HtmlDocument(); 
html.LoadHtml(htmlText); 
HtmlNode doc = html.DocumentNode; 

HtmlNodeCollection nodes = doc.SelectNodes("//font[.//text()[contains(substring-after(., '['), ']')]]"); 

if (nodes != null) 
{ 
    foreach (HtmlNode node in nodes) 
    { 
     Console.WriteLine(node.OuterHtml); 
    } 
} 
相關問題