2010-12-19 16 views
0
<tr bgcolor='#C0C0C0'> 
    <td>ID</td><td>personName</td> 
    <td>homePhone<br>officePhone</td> 
    <td>city</td> 
    <td>street</td> 
</tr> 

好的,所以這是一個HTML我得到作爲一個web響應,我需要解析它與grups提取ID,personName,城市,homePhone,辦公電話和街道。無法得到適當的正則表達式這個簡單的HTML

任何人都可以給我一個REGEX模式嗎?我一直在努力幾個小時,我看不出我錯在哪裏。無論如何,有沒有什麼好的工具來創建正則表達式,一遍又一遍地運行應用程序是一種痛苦。謝謝。

+5

首先,正則表達式是一個糟糕的選擇作爲HTML解析器。您應該爲您的平臺和語言使用HTML解析器。其次你使用什麼語言/平臺? RegEx方言可能完全不同。 – Oded 2010-12-19 20:03:54

+4

在這裏閱讀有關您的問題的詳細解釋:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – 2010-12-19 20:04:10

+0

http:// www。 regexbuddy.com/是我選擇的工具。如果使用正則表達式解析HTML,它仍然不會讓你不再瘋狂。 – TrueWill 2010-12-19 21:02:05

回答

0

(假設.NET ...)

這應做到:

(?s:<tr.*?>(?:.*?<td.*?>(?<content>.*?)</td>)*) 

提取這些值:

  • ID
  • personName
  • homePhone<br>officePhone
  • city
  • street

它會返回一個比賽,一個組,多次捕捉。

例如,此代碼會將每個值寫入控制檯。

var input = "<tr bgcolor='#C0C0C0'><td>ID</td>\n<td>personName</td>\n<td>homePhone\n<br>officePhone</td>\n<td>city</td>\n<td>street</td></tr>"; 
var pattern = "(?s:<tr.*?>(?:.*?<td.*?>(?<content>.*?)</td>)*)"; 

var match = Regex.Match(input, pattern); 

foreach (var capture in match.Groups["content"].Captures) 
    Console.WriteLine(capture.Value); 

它可以處理任意數量的單元格。它會忽略單元格之間的文本,新行和空白。它會忽略行或單元格上的任何屬性。

我用這個工具使用正則表達式:http://www.radsoftware.com.au/regexdesigner/

+0

謝謝。這很好用!但是,請你解釋一下。*?是的,和s的含義:爲什麼不。*?匹配>立即之後?在任何地方都找不到。 – Ryan 2010-12-20 09:12:39

+0

(?s:表達式)是一個選項修飾符,它將其置於「單線模式」。在這種模式下,「。」字符匹配所有字符*,包括*新行。 「*?」意味着一場懶散的比賽。也就是說,它可以捕捉儘可能少的字符。所以,像「。*?>」這樣的字符將會匹配任何字符,直到遇到「>」。 – 2011-01-29 12:50:32

+0

如果這適用於您,請將答案標記爲「已接受」。 – 2011-01-29 12:52:44