C# 使用正则表达式从HTML字符串解析HREF
我需要用html解析一个zip文件的链接。此zipfile的名称每月都会更改。下面是我需要解析的HTML片段:C# 使用正则表达式从HTML字符串解析HREF,c#,regex,C#,Regex,我需要用html解析一个zip文件的链接。此zipfile的名称每月都会更改。下面是我需要解析的HTML片段: 我需要的字符串是“http://nppes.viva-it.com/NPPES_Data_Dissemination_Mar_2012.zip“因此,我可以使用WebClient下载该文件。zip文件URL中每月保持不变的唯一部分是“http://nppes.viva-it.com/". 是否有一种方法可以使用正则表达式来解析完整的URL,“http://nppes.viva-i
我需要的字符串是“http://nppes.viva-it.com/NPPES_Data_Dissemination_Mar_2012.zip“因此,我可以使用WebClient下载该文件。zip文件URL中每月保持不变的唯一部分是“http://nppes.viva-it.com/". 是否有一种方法可以使用正则表达式来解析完整的URL,“http://nppes.viva-it.com/NPPES_Data_Dissemination_Mar_2012.zip“,超出HTML?如果页面上只链接到一个ZIP,则无问题:
Regex re = new Regex(@"http://nppes\.viva-it\.com/.+\.zip");
re.Match(html).Value // To get the matched URL
这是一个原始正则表达式-使用分支重置。
答案在捕获缓冲区2中
<a
(?=\s)
(?= (?:[^>"']|"[^"]*"|'[^']*')*? (?<=\s)
href \s*=
(?|
(?> \s* (['"]) \s* (http://nppes\.viva-it\.com/ (?:(?!\g{-2}) .)+ \.zip ) \s* \g{-2} )
| (?> (?!\s*['"]) \s* () (http://nppes\.viva-it\.com/ [^\s>]* \.zip ) (?=\s|>) )
)
)
\s+ (?:".*?"|'.*?'|[^>]*?)+
>
“']|“[^”]*“[^']*”)*?(?\s*(['”])\s*(http://nppes\.viva it\.com/(?:(?!\g{-2})。+\.zip)\s*\g{-2})
|(?>(?!\s*['”])\s*()(http://nppes\.viva it\.com/[^\s>]*\.zip)(?=\s}>)
)
)
\s+(?:“*?”|“.*?”|[^>]*?)+
>
不确定C#是否可以执行分支重置。如果不能,则此变体有效。答案始终是捕获缓冲区2与捕获缓冲区3的匹配结果
<a
(?=\s)
(?= (?:[^>"']|"[^"]*"|'[^']*')*? (?<=\s)
href \s*=
(?:
(?> \s* (['"]) \s* (http://nppes\.viva-it\.com/ (?:(?!\g{-2}) .)+ \.zip ) \s* \g{-2} )
| (?> (?!\s*['"]) \s* (http://nppes\.viva-it\.com/ [^\s>]* \.zip ) (?=\s|>) )
)
)
\s+ (?:".*?"|'.*?'|[^>]*?)+
>
“']|“[^”]*“[^']*”)*?(?\s*(['”])\s*(http://nppes\.viva it\.com/(?:(?!\g{-2})。+\.zip)\s*\g{-2})
|(?>(?!\s*['”])\s*(http://nppes\.viva it\.com/[^\s>]*\.zip)(?=\s}>)
)
)
\s+(?:“*?”|“.*?”|[^>]*?)+
>
通过使用:
var html=”“;
var doc=新的HtmlDocument();
doc.LoadHtml(html);
var anchor=doc.DocumentNode.SelectSingleNode(“//a”);
var href=anchor.GetAttributeValue(“href”,null);
现在href
变量保持”http://nppes.viva-it.com/NPPES_Data_Dissemination_Mar_2012.zip“
value
它不是比正则表达式更简单吗?在一般情况下,使用正则表达式解析HTML是行不通的。无论您构建的模式多么狭窄,一个完全合法的HTML文件都可以击败它。使用真正的parserSee:
var html = "<a href=\"http://nppes.viva-it.com/NPPES_Data_Dissemination_Mar_2012.zip\">";
var doc = new HtmlDocument();
doc.LoadHtml(html);
var anchor = doc.DocumentNode.SelectSingleNode("//a");
var href = anchor.GetAttributeValue("href", null);