克服HTML文本块中的换行

克服HTML文本块中的换行,html,regex,vba,Html,Regex,Vba,我知道我不应该使用正则表达式来解析HTML,我保证会查看HTML敏捷包,但在此期间,一些专家能否告诉我是否有一种模式可以匹配整个块 <tr bgcolor="#f4f4ff"><td align="center"><font size="2">42</font></td> <td align="center"><font size="2">35</font></td> <td>

我知道我不应该使用正则表达式来解析HTML,我保证会查看HTML敏捷包,但在此期间,一些专家能否告诉我是否有一种模式可以匹配整个块

<tr bgcolor="#f4f4ff"><td align="center"><font size="2">42</font></td>
<td align="center"><font size="2">35</font></td>
<td><font size="2"><a href="/movies/?id=bears.htm"><b>Bears</b></a></font></td>
<td><font size="2"><a href="/studio/chart/?view2=calendar&yr=2014&studio=buenavista.htm">BV</a></font></td>
<td align="right"><font size="2"><b>$33,845</b></font></td>
<td align="right"><font size="2"><font color="#ff0000">-60.1%</font></font></td>
<td align="right"><font size="2">75</font></td>
<td align="right"><font size="2"><font color="#ff0000">-35</font></font></td>
<td align="right"><font size="2">$451</font></td>
<td align="right"><font size="2">$17,492,470</font></td>
<td align="right"><font size="2">-</font></td>
<td align="center"><font size="2">8</font></td>
</tr>
42
35
$33,845
-60.1%
75
-35
$451
$17,492,470
-
8.
我使用的是VBA,而regexoptions似乎不可用。我不停地摆弄,而且“应该有用”就像



不要。我可以把所有的东西都匹配起来,直到第一次断线,然后我撞到了砖墙。如果单线选项不可用,是否有解决方法?在尝试匹配之前,是否可以使用VBA REPLACE函数将所有vbcrlf实例更改为其他字符?有人能给我举一个例子,说明使用HTML agility pack会变得多么容易吗?

好的,那么您已经听到了反对使用正则表达式解析HTML的警告了吗

据我所知,VBAScript没有DOTALL模式,因此为了跨行匹配,我们必须使用以下内容制作一个伪DOTALL点:
(?:.|[\r\n])
[\s\s]

此正则表达式将与您的块匹配:

<tr[\s\S]*?</tr>
=1那么
匹配的\u块=myMatches(0)。值
其他的
匹配的_block=“”
如果结束

优秀。。。我以为我在这里找到了答案{link](),但是行表达式--
]*>(.*)
--只有在没有换行符的情况下才起作用。我必须消除所有换行符才能使它起作用。你的换行符在没有这个额外步骤的情况下工作得很好。不过有一点我不明白--为什么它需要“*”和“?”工作?它们是如何协同工作的?你能把你的模式翻译成英语吗?它与
\d?
中的
不同。例如
使
*
变懒:它只匹配下一个
。没有它,
*
是贪婪的,在回溯之前滚动到字符串的末尾最后一个
。读一读,男孩,细微差别可以带来所有的不同…这解释了为什么我在实验时得到了整个表格而不是一行。最后一个问题:现在我有了s,我需要得到s中的信息。这个模式
>[^Comments不是一种很好的格式。我很难理解您想要什么。请提出一个新问题。好的,完成。线程标题是“是否可以仅提取之间的数据?”@user3732258
<tr[\s\S]*?</tr>
Dim myRegExp, myMatches, matched_block
Set myRegExp = New RegExp
myRegExp.Pattern = "<tr[\s\S]*?</tr>"
Set myMatches = myRegExp.Execute(SubjectString)
If myMatches.Count >= 1 Then
    matched_block = myMatches(0).Value
Else
    matched_block = ""
End If