我正在尝试确定C#脚本中$
属性的数量。
下面是我从StreamReader返回并传递给var(href
)
responsefromserver
我想要做的是获得一个匹配(使用正则表达式),这样我就可以计算URL中<html>
<head><title>Index of /file-download/isin/20170917/</title></head>
<body bgcolor="white">
<h1>Index of /file-download/isin/20170917/</h1><hr><pre><a
href="../">../</a>
<a href="Commodities/">Commodities/</a>
18-Sep-2017 00:05 -
<a href="Credit/">Credit/</a>
18-Sep-2017 00:05 -
<a href="Equity/">Equity/</a>
18-Sep-2017 00:05 -
<a href="Foreign_Exchange/">Foreign_Exchange/</a>
18-Sep-2017 00:05 -
<a href="Rates/">Rates/</a>
18-Sep-2017 00:05 -
</pre><hr></body>
</html>
的数量(这些数量可以从1到5个不等(商品,信用,权益,FX&amp; amp; ;率)然后我可以将计数传递给变量以便稍后使用。
href
名称永远不会更改,但我需要确认计数,以便我可以检查下载的文件数是否与href
的计数相符(每个href
都有在它下面的文件)。
我的正则表达能力是垃圾,而且我永远无法在条款(商品,信用,股票,外汇和利率)上匹配,所以任何帮助构建该字符串都会很棒。
任何指导都很棒,我不是一个大C#用户,我在SSIS包中使用它,我使用HTMLAgilityPack,所以如果有另一种方式比我更清洁/更好愿意接受建议。任何代码片段,我可以使用,给我我需要的东西,使用XPath将是方便的,因为我不是一个普通的c#用户(还)
非常感谢提前。
答案 0 :(得分:0)
首先,您必须声明要匹配的字符串
string[] toMatch = {"Rates","Foreign_Exchange","Equity","Credit","Commodities"};
带有href属性的链接的Xpath是"//a[@href]"
要知道您想要的列表中的Href是否与您匹配:
toMatch.Any(myHrefValue.Contains)
导致以下代码:
var doc = new HtmlDocument();
doc.LoadHtml(input);
string[] toMatch = {"Rates","Foreign_Exchange","Equity","Credit","Commodities"};
var result = doc.DocumentNode
.SelectNodes("//a[@href]")
.Select(tag => tag.Attributes["href"].Value)
.Where(link => toMatch.Any(s => link.Contains(s)));
您现在拥有匹配的所有Href。一个简单的.Count()
是您需要的最后一步。
答案 1 :(得分:0)
使用正则表达式作为SSIS似乎是有限的。
你应该使用这样的模式:href="(Commodities|Credit|Equity|Foreign_Exchange|Rates)\/"
。
string pattern = @"href=""(Commodities|Credit|Equity|Foreign_Exchange|Rates)\/""";
var result = Regex.Matches(input, pattern).Count;
如果需要从db:
构建模式string[] toMatch = { "Rates", "Foreign_Exchange", "Equity", "Credit", "Commodities" };
string pattern2 = @"href=""("+String.Join("|", toMatch)+@")\/""";
问题是如果您无法控制Html输入。因为这将匹配任何Href不仅链接。像这样的正则表达式:<a.*href="(Commodities|Credit|Equity|Foreign_Exchange|Rates)\/"