使用正则表达式解析 HTML 并不理想。其他人建议使用 HTML Agility Pack。但是,如果您可以保证您的输入是明确定义的并且您始终知道会发生什么,那么使用正则表达式是可能的。
如果您能做出这样的保证,请继续阅读。否则,您需要考虑其他建议或更好地定义您的输入。事实上,你应该更好地定义你的输入,因为我的回答做了一些假设。需要考虑的一些问题:
- HTML 是一行还是多行,由换行符分隔?
- HTML 是否总是采用
<div>...<h2...>...</h2><h3...>...</h3></div> 的形式?或者可以有h1-h6标签吗?
- 在
hN 标记之上,日期和数字是否始终位于id 属性具有id-date 和nr 值的标记之间?
根据这些问题的答案,模式可能会发生变化。下面的代码假定每个 HTML 片段都遵循您共享的结构,它将有一个 h2 和 h3 分别带有日期和数字,并且每个标签都将在一个新行上。如果你给它提供不同的输入,它可能会中断,直到模式与你的输入结构匹配。
Dim input As String = "<div id=""div"">" & Environment.Newline & _
"<h2 id=""id-date"">09.09.2010</h2>" & Environment.Newline & _
"<h3 id=""nr"">000</h3>" & Environment.Newline & _
"</div>"
Dim pattern As String = "<div[^>]+>.*?" & _
"<h2\sid=""id-date"">(?<Date>\d{2}\.\d{2}\.\d{4})</h2>.*?" & _
"<h3\sid=""nr"">(?<Number>\d+)</h3>.*?</div>"
Dim m As Match = Regex.Match(input, pattern, RegexOptions.Singleline)
If m.Success Then
Dim actualDate As DateTime = DateTime.Parse(m.Groups("Date").Value)
Dim actualNumber As Integer = Int32.Parse(m.Groups("Number").Value)
Console.WriteLine("Parsed Date: " & m.Groups("Date").Value)
Console.WriteLine("Actual Date: " & actualDate)
Console.WriteLine("Parsed Number: " & m.Groups("Number").Value)
Console.WriteLine("Actual Number: " & actualNumber)
Else
Console.WriteLine("No match!")
End If
图案可以在一条线上,但为了清楚起见,我将其分开。 RegexOptions.Singleline 用于允许 . 元字符处理 \n 换行符。
你也说过:
而且这将是循环的,意思是
需要更多的 div 块
已解析。
您是否在单独的字符串上循环?或者您是否期望在单个字符串中多次出现上述 HTML 结构?如果是前者,则应将上述代码应用于每个字符串。对于后者,您需要使用 Regex.Matches 并将每个 Match 结果与上述代码类似。
编辑:这里是一些示例代码,用于演示解析多个匹配项。
Dim input As String = "<div id=""div"">" & Environment.Newline & _
"<h2 id=""id-date"">09.09.2010</h2>" & Environment.Newline & _
"<h3 id=""nr"">000</h3>" & Environment.Newline & _
"</div>" & _
"<div id=""div"">" & Environment.Newline & _
"<h2 id=""id-date"">09.14.2010</h2>" & Environment.Newline & _
"<h3 id=""nr"">123</h3>" & Environment.Newline & _
"</div>"
Dim pattern As String = "<div[^>]+>.*?" & _
"<h2\sid=""id-date"">(?<Date>\d{2}\.\d{2}\.\d{4})</h2>.*?" & _
"<h3\sid=""nr"">(?<Number>\d+)</h3>.*?</div>"
For Each m As Match In Regex.Matches(input, pattern, RegexOptions.Singleline)
Dim actualDate As DateTime = DateTime.Parse(m.Groups("Date").Value)
Dim actualNumber As Integer = Int32.Parse(m.Groups("Number").Value)
Console.WriteLine("Parsed Date: " & m.Groups("Date").Value)
Console.WriteLine("Actual Date: " & actualDate)
Console.WriteLine("Parsed Number: " & m.Groups("Number").Value)
Console.WriteLine("Actual Number: " & actualNumber)
Next