2013-10-29 16 views
-2

当正则表达式在.NET处理我有两个选择:正则表达式:匹配和捕获.NET中的一个模式

  1. 检查字符串模式匹配:

    <a ([^>]*?)href=\"http://the.site.com/photo/[0-9]*\">

  2. 捕获属于部分图案:

    <a ([^>]*?)href=\"http://the.site.com/photo/(?<photoname>.*?)\">

但是如果我想检查模式匹配并捕获与单个RegEx相匹配的部分,该怎么办?

+0

如果它不匹配,它将如何捕获它? Lookaheads/lookbehinds用于捕获部分匹配 – Jonesopolis

+0

@Jonesy:'(?。*?)'将捕获任何字符序列,但我只需要[0-9] *'。 – Paul

+0

@Paul - 你为什么用'。*'替换'[0-9] *'? – BeemerGuy

回答

2

拍摄时只需使用此:

<a ([^>]*?)href=\"http://the.site.com/photo/(?<photoname>[0-9]+)\"> 
+0

如果'href ='!如果href不是唯一的属性..如果它是一个自我封闭的标记..请不要使用正则表达式..这会破坏你的代码..请 – Anirudha

+2

@Anirudh你会发现其他999失败状态怎么样? – Gusdor

+0

@Gusdor 999+是文字本身包含锚定标记的情况(Ex.comments和ans不是html本身的一部分,但是文字)你怎么区分它们呢?也可以有任意的数字你不会为每一个添加'\ s',或者你是在 – Anirudha

0

使用htmlAgilityPack

HtmlDocument doc = new HtmlDocument(); 
doc.Load(htmlUrl); 

var [email protected]"^(?<=https?://the.site.com/photo/)\d+$"; 
var hrefList= doc.DocumentNode 
       .SelectNodes("//a[@href]") 
       .Select(p =>p.Attributes["href"].Value)//select all hrefs 
       .Where(p => Regex.IsMatch(p,pattern))//filter href 
       .Select(p=>Regex.Match(p,pattern).Value);//select required digits 
+1

敏捷包在这里矫枉过正。简单的OP想要匹配URL。 – Gusdor

+0

@Gusdor想出了一个正则表达式..我会给1000的情况下,它打破......;) – Anirudha

0

好先生,你可以用一个模式相匹配,并捕获到一个组!

<a (?:[^>]*?)href\s*?=\s*\"http://the.site.com/photo/(?<photoname>[0-9]+)\" 

组名为photoname将包含你想要捕获。

即使href不是a元素的第一个属性,该正则表达式仍然可以工作。它也会忽略任意空间。