2012-04-20 87 views
1

這裏是我的正則表達式:正則表達式不工作的C#

href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+)) 

,這裏是我有:

"<p>dfhdfh</p>\r\n<p><a href=\"/Content/blabla/345/344\">najnov</a></p>\r\n<p>&nbsp;</p>\r\n<p><a href=\"/Content/blabla/345/323:test 1\">test 1&nbsp;</a></p>" 

但m.Groups是:

{href="/Content/blabla/345/344"} 
{/Content/blabla/345/344} 

如何獲得第二個href在m?

這裏是我的代碼:

Match m = Regex.Match(myString, "href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))", RegexOptions.IgnoreCase); 
       if (m.Success) 
       { 
        for (int ij = 0; ij < m.Groups.Count; ij++) 
         myString = myString.Replace(m.Groups[ij].Value.Substring(7), m.Groups[ij].Value.Substring(m.Groups[ij].Value.LastIndexOf("/") + 1)); 
       } 
+5

[您不應該試圖用正則表達式解析HTML。](http://stackoverflow.com/a/1732454/41071)改爲使用HTML解析器,比如HTML Agility Pack。 – svick 2012-04-20 09:47:34

+0

另外,你能告訴我們你的代碼實際上使用你的正則表達式嗎? – svick 2012-04-20 09:48:52

+0

@svick有它。 – 2012-04-20 09:53:07

回答

1

從這個測試使用RAD software RegEx designer

此正則表達式返回多個匹配,每個匹配中的一個。所以你不應該試圖從組中得到你的結果(命名爲「1」),你應該迭代匹配的集合並檢索每個組的值(或每個組中的值)。

這是獲取輸出結果:

output from RAD RegEx designer

所以,你應該調用代碼Regex.Matches,並通過結果,而不是Regex.Match迭代。

1

除了HTML /正則表達式的東西,要立即獲取所有結果,使用Matches,該方法返回MatchCollection包含所有找到Match對象。

請參閱msdn上的The MatchCollection and Match Objects

0

我要去承擔原始字符串是這樣的:

<p>dfhdfh</p> 
<p><a href="/Content/blabla/345/344">najnov</a></p> 
<p>&nbsp;</p> 
<p><a href="/Content/blabla/345/323:test 1">test 1&nbsp;</a></p> 

..和你貼的是字符串文字你會用它來創建的字符串。讓所有的href屬性出來的就是這樣簡單:

Regex r = new Regex(@"href\s*=\s*(?:""(?<HREF>[^""]*)""|(?<HREF>\S+))"); 

foreach (Match m in r.Matches(htmlString)) 
{ 
    Console.WriteLine(m.Groups["HREF"].Value); 
} 

我通過更名捕獲組來HREF要清楚,我們正在通過其檢索組,不它的數量。

正如你所看到的,你正在做一些你不需要做的工作。