c# - 在 c# 中如何更好地解析这个 html 内容?
问题描述
我在一个字符串数组中收集了这个 Web 服务器数据。我正在正确对齐以Regex
获取更好的可读格式。
string[] liness = Regex.Split(html, "\r\n");
里面的数据liness
现在看起来像这样。
<html><head><title>137.55.124.65 - /</title></head><body><H1>137.55.124.65 - /</H1><hr>
Thursday, June 7, 2018 6:27 PM <dir> <A HREF="/2.5.25557/">2.5.25557</A>
Thursday, June 14, 2018 5:25 PM <dir> <A HREF="/2.5.25569/">2.5.25569</A>
Wednesday, June 20, 2018 8:34 AM <dir> <A HREF="/2.5.25578/">2.5.25578</A>
Wednesday, June 20, 2018 5:33 PM <dir> <A HREF="/2.5.25580/">2.5.25580</A>
Tuesday, June 26, 2018 8:36 AM <dir> <A HREF="/2.5.25581/">2.5.25581</A>
Friday, June 29, 2018 8:36 AM <dir> <A HREF="/2.5.25582/">2.5.25582</A>
Tuesday, July 3, 2018 8:35 AM <dir> <A HREF="/2.5.25584/">2.5.25584</A>
Thursday, July 5, 2018 8:35 AM <dir> <A HREF="/2.5.25586/">2.5.25586</A>
Monday, July 16, 2018 8:33 AM <dir> <A HREF="/2.5.25587/">2.5.25587</A>
Tuesday, May 29, 2018 8:30 PM 696 <A HREF="/iisstart.htm">iisstart.htm</A>
Tuesday, May 29, 2018 8:30 PM 98757 <A HREF="/iisstart.png">iisstart.png</A>
Wednesday, November 19, 2014 3:41 PM 214 <A HREF="/index.html">index.html</A>
我如何才能更好地仅提取以开头的值,2.*.**** (ex: 2.5.8827)
并且如果您注意到每行HREF="/2.5.25425/">
也具有重复值。解析并将所有这些值放入一个列表中,然后这是获取最高版本号的棘手部分(单个值)
ex: 2.5.1000 , 2.5 1001. 2.5.1002. 2.5.1003.
上面示例列表中我的最高版本是2.5.1003
我已经尝试使用正则表达式进行上述操作。
List<string> versionvalue = new List<string>();
string pattern = "2.";
foreach (String l_html in liness)
{
string[] substrings = Regex.m(l_html, pattern);
//versionvalue.Add(substrings[]);
if ((l_html.Contains("2.")) && (l_html.Contains(currentYear.ToString()) ))
{
}
}
但看起来很乱,没有找到我正在寻找的任何值。会regex.matches
工作吗?所有帮助表示赞赏!
解决方案
您正在寻找的正则表达式模式是<A HREF="\/(\d\.\d\.\d{5})\/">
,即捕获单个数字、点、单个数字、点、五个数字中的<A HREF="">
. 此模式的正则表达式 101。
提取这些字符串后,将它们解析为一个VersionNumber
类。该类通过IComparable
接口实现比较。这可以确保 VersionNumbers 可以正确排序OrderBy
。
public class VersionNumber : IComparable {
public int Major { get; set; }
public int Minor { get; set; }
public int Revision { get; set; }
// Converts string to VersionNumber object
public static VersionNumber Parse(string s) {
if (string.IsNullOrWhiteSpace(s)) {
throw new ArgumentNullException(nameof(s));
}
var parts = s.Split(new [] {'.'});
if (parts.Count() != 3) {
throw new ArgumentException("Input string must be in format 'X.Y.ZZZZZ'.");
}
var result = new VersionNumber();
try {
result.Major = int.Parse(parts[0]);
result.Minor = int.Parse(parts[1]);
result.Revision = int.Parse(parts[2]);
}
catch (FormatException) {
throw new ArgumentException("Input string must be in format 'X.Y.ZZZZZ', with X, Y, Z integers.");
}
return result;
}
// Compares two VersionNumbers
public int CompareTo(object obj) {
if (obj == null) return 1;
VersionNumber otherVersion = obj as VersionNumber;
if (otherVersion == null) {
throw new ArgumentException($"Object is not a {nameof(VersionNumber)}.");
}
// start comparison with Major Version, then Minor, then Revision
var result = Major.CompareTo(otherVersion.Major);
if (result == 0) {
result = Minor.CompareTo(otherVersion.Minor);
}
if (result == 0) {
result = Revision.CompareTo(otherVersion.Revision);
}
return result;
}
public override string ToString() {
return Major + "." + Minor + "." + Revision;
}
}
另请参阅此.Net Fiddle示例用法:
string[] versionStrings = new [] {"3.5.25569", "2.5.25557", "2.5.25580", "2.5.25569", "2.4.25569"};
// parsing
IEnumerable<VersionNumber> versions = versionStrings.Select(s => VersionNumber.Parse(s));
// sorting
IOrderedEnumerable<VersionNumber> sorted = versions.OrderBy(v => v);
// sorted: 2.4.25569, 2.5.25557, 2.5.25569, 2.5.25580, 3.5.25569
推荐阅读
- c# - TinyMce 5.0.14 在 IE 和 Edge 上拼写检查错误不起作用
- python - 静态方法如何不绑定到“静态方法”类?
- javascript - InStr 与 indexOf
- visual-studio-code - 禁用自动替换 Visual Studio 代码
- c - 如何在 EOF 之前读取多个整数和字符串输入的 scanf?
- r - purrr::lift_vd 不适用于某些功能
- javascript - 当 body 使用 Fullpage.js 有一个类时隐藏或显示元素
- powershell - 如何将包含美元符号的参数传递给 Powershell 中的程序?/ 远程连接问题
- c++ - 对表进行排序 C++
- python - 如何使用 unicode 版本的 Windows API:mciSendString()、Python