如何从特定字符串中提取时间?

时间:2015-01-11 07:25:51

标签: c# .net regex winforms

我的代码是:

htmltoextract = new Uri("http://test");

client = new WebClient();
f = client.DownloadString(htmltoextract);
client.Dispose();
string pattern = @"(\d{12})";
Regex ex = new Regex(pattern, RegexOptions.Singleline);

MatchCollection matches = ex.Matches(f);
IFormatProvider provider = CultureInfo.InvariantCulture;
List<DateTime> dateTime = new List<DateTime>();
foreach (Match match in matches)
{
     dateTime.Add(DateTime.ParseExact(match.Value, "yyyyMMddHHmm", provider));
}

f里面的某个地方,我有这一行:

var imageUrls = ["/image2.ashx?region=is&time=201501102145&ir=false","/image2.ashx?region=is&time=201501102130&ir=false","/image2.ashx?region=is&time=201501102115&ir=false","/image2.ashx?region=is&time=201501102100&ir=false","/image2.ashx?region=is&time=201501102045&ir=false","/image2.ashx?region=is&time=201501102030&ir=false","/image2.ashx?region=is&time=201501102015&ir=false","/image2.ashx?region=is&time=201501102000&ir=false","/image2.ashx?region=is&time=201501101945&ir=false"];

我需要将其提取两次到两个列表:

第一个List是dateTime

第二个List应该是字符串,它应该添加到它:

/image2.ashx?region=is&time=201501102145&ir=false
/image2.ashx?region=is&time=201501102130&ir=false
/image2.ashx?region=is&time=201501102115&ir=false
/image2.ashx?region=is&time=201501102100&ir=false
/image2.ashx?region=is&time=201501102045&ir=false
/image2.ashx?region=is&time=201501102030&ir=false
/image2.ashx?region=is&time=201501102015&ir=false
/image2.ashx?region=is&time=201501102000&ir=false
/image2.ashx?region=is&time=201501101945&ir=false

我有两个问题:

如何提取时间和字符串/image2.ashx?region=is&time=201501101945&ir=false

如何仅从部分中提取所有内容:var imageUrls = [&#34; ........

由于在f里面还有其他地方,我需要从var imageUrls = [&#34;并以&#34;];

结束

3 个答案:

答案 0 :(得分:0)

步骤:

  • 使用HtmlAgilityPack获取Html并提取特定的<script>标记。
  • 可能脚本块只能与reg-ex匹配,甚至可以与基本String.IndexOf匹配以删除网址列表
  • 只有网址列表使用String.Split来切换为唯一的
  • 对于每个Url,使用Uri类提取Uri.Query部分而不是Get individual query parameters from Uri

注意:如果JavaScript太复杂,您可能需要获得真正的JavaScript解析器......

答案 1 :(得分:0)

这就是我要做的。它不是纯粹的解决方案,但它确实有效。

(以下假设您的数据格式在合理的时间段内保持完全相同。如果管理源的人员发生变化,此代码将中断!)

  1. 对模式进行正则表达式匹配&#34; var imageUrls = [...];&#34;并将其移动到一个单独的字符串。
  2. 由此,从字符串中删除var imageUrls = [];
  3. 路径A:

    1. 使用string.split(),创建一个url字符串数组。
    2. 在字符串中运行for循环并将它们分配给Uri类(例如:myUri)。您现在可以通过HttpUtility.ParseQueryString(myUri.Query).Get("time");
    3. 获取每个查询字符串变量的值部分

      路径B:

      1. 同时砍掉&#34; /image2.ashx?region = is&amp; time =&#34;和&#34;&amp; ir = false&#34;只留下你真正想要的东西。

答案 2 :(得分:0)

要匹配时间使用:

(?!/image2\.ashx\?region=is&time)\d+(?=&ir=false)

DEMO