2012-02-06 91 views
0

我需要一個正則表達式來幫助我在字符串中進行匹配。這是一個包含了信息,我需要行:爲HTML創建正則表達式

<td width="140" height="18"><a href="users_folders.cfm?viewfolder=86&viewsub=20207&addSub=20202" class="folderNav"><strong>087690898</strong></a></td> 

我需要拉出來的是在href "users_folders.cfm?viewfolder=86&viewsub=20207&addSub=20202"的地址和存儲這兩個強大的標籤087690898之間的值。所以我只需要識別看起來像這樣的線。

因此,我已理解了它到了這一點:

(匹配任何字符或數字)(匹配< A HREF = 「)(匹配任何字符或數字)(匹配類=」 folderNav「>)

其中我已經創建了這個作爲我的正則表達式:

[AZ] (< A HREF = 「)[AZ](類=」 folderNav「>)

一旦我已經確定這個字符串,我可以解析它拉出我需要的值,但是它確定了我遇到的問題。我是新來的正則表達式,並不確定如何做到這一點。我知道正則表達式是有缺陷的。我正在使用C#。

此外,我知道你不應該在HTML上使用正則表達式,但爲此,我不介意快速和骯髒的解決方案。

+2

只是因爲它的相似並不意味着你有* *爲關閉欺騙。事實上,有些時候,[你應該停止擔心和愛他們。](http://blog.stackoverflow.com/2010/11/dr-strangedupe-or-how-i-learned-to-stop-worrying-and -love-duplication /) – Will 2012-02-06 20:43:50

回答

3

雖然純粹主義者會譴責我永恆的詛咒打破正則表達式/ HTML規則,這裏就是你需要:

string line = @"<td width=""140"" height=""18""><a href=""users_folders.cfm?viewfolder=86&viewsub=20207&addSub=20202"" class=""folderNav""><strong>087690898</strong></a></td>"; 
Match match = Regex.Match(line, @"<a href=""(?<addr>[^""]*)"" class=""folderNav""><strong>(?<val>[^<]*)</strong></a>"); 
string addr = match.Groups["addr"].Value; 
string val = match.Groups["val"].Value; 

(?<name>expression)部分被稱爲「named matched subexpressions」;您可以通過鏈接到MSDN來閱讀更多關於它們的信息。

在上面的代碼中,我們使用命名的子表達式來匹配您的地址和您的值。在每種情況下,我們允許任何字符匹配,除了預期的終止符。在href地址的情況下,屬性值在"之前結束;因此,我們匹配[^"]*。在<strong>值的情況下,元素文本在<(結束標記的)之前結束;因此,我們匹配[^<]*。正則表達式模式的其餘部分是逐字的。

+0

工作得很漂亮。謝謝! – user489041 2012-02-06 22:25:48

2

像這樣的東西只是爲我工作:

<a href="(?<HREF>[^\"\ ]*)"[^\>]*><strong>(?<TEXT>.*)</strong> 

Regex regexObj = new Regex("<a href=\"(?<HREF>[^\" ]*)\"[^>]*><strong>(?<TEXT>.*)</strong>", RegexOptions.IgnoreCase); 

var match = regexObj.Match(subjectString); 

if (match.Success) 
{ 
string href = match.Groups["HREF"].Value; 
string text = match.Groups["TEXT"].Value; 
}