2010-07-16 63 views
1

此正則表達式僅返回一個匹配項。 (我在找檢索所有圖像源/地區(如包含在IMG HTML標記中src屬性「文件夾/ image.png」)僅返回一個匹配的正則表達式

樣品輸入字符串:

input = @"<p>here is an image</p><img attr=""ahwer"" src=""~/Images/logo.png"" st=""abc""/><p>some more text here</p>"; 
      s += @"<p>test</p><img src=""a.jpg"" /><img src=""folder/image.png"" />" 

模式

pattern = @"<img.*src=""([^""]*)"".*/>"; 

的MatchCollection計數始終爲1(奇怪的是,只有最後一場比賽,在這種情況下,「文件夾/ image.png」。每當我換着花樣來簡單的「IMG」,發現所有的三個圖像標記。所以,這很可能是我的正則表達式模式不正確。我不是正則表達式的大師,並會感謝任何幫助。

+0

檢查以確保你有雙引號適量。我不熟悉.NET的正則表達式的特殊風格,但它看起來像你有太多的目標和模式。 – MikeD 2010-07-16 21:13:48

+0

@MikeD:引號是好的。這就是你如何在C#的逐字符串文字中使用引號:將它們加倍。 – 2010-07-16 21:27:49

回答

2

嘗試pattern = @"<img.*?src=""([^""]*)"".*?/>"; - 使用*。?這些匹配應該是非貪婪的(即在匹配和下一部分之前不會消耗他們所能做的一切)。

+0

就是這樣。現在獲得所有三場比賽。我在發佈之前幾秒鐘就想到了這一點。謝謝! – Gabe 2010-07-16 21:17:27

3

Do not parse HTML using regular expressions

相反,你應該使用HTML Agility Pack,就像這樣:

var doc = new HtmlDocument(); 
doc.Load(path); 
//Or 
doc.Parse(source); 

var paths = doc.DocumentElement.Descendants("img") 
           .Select(img => img.Attributes["src"].Value); 
+0

感謝您的鏈接。但是,我不會做主要的HTML操作,所以我寧願不必使用第三方庫。 – Gabe 2010-07-16 21:18:33

0

你的正則表達式的內部太寬鬆了,它允許匹配一次吞下所有的圖片標籤。

但實際上,你不應該嘗試使用正則表達式來解析HTML。瘋狂在於這樣...

0

嘗試模式

pattern = @"(?<=.src="")[\w\/\.~]+";