有没有办法对多行html块进行正则表达式?

问题描述 投票:-1回答:1

这是我html页面的一部分。我想找到标签之间的所有名称: td>其多行和“新”按键每次都有不同的编号。

        <tr class="hl">
        <td class="vil fc">
            <a href="mypage.php?new=4645">
                name                </a>
        </td>
html regex vb.net multiline
1个回答
1
投票

Regex类,默认情况下,确实会搜索整个多行字符串,它将找到跨越多行的匹配项。但是,匹配项是否可以跨越多行取决于您的模式。如果您给出的模式表明匹配项必须全部在一行上,那么显然不会返回任何多行匹配项。因此,例如:

Dim input As String = "Canine
Dog
K9
D
o
g
Puppy"
Dim count As Integer = Regex.Matches(input, "Dog").Count 
Dim countMulti As Integer = Regex.Matches(input, "D\s*o\s*g").Count 
Console.WriteLine(count)      ' Outputs "1"
Console.WriteLine(countMulti) ' Outputs "2"

由于\s*表示任意数量的空格(包括换行符,所以第二个模式将与第二个模式匹配,其中每个字母都在其自己的行上。

因此,如果默认情况下它有效,并且您正在询问它,那么我认为真正的问题是您不允许在模式中使用换行符。因此,例如,这将起作用:

Dim input As String = "<tr class=""hl"">
<td class=""vil fc"">
<a href=""mypage.php?New=4645"">
        name                </a>
</td>"
Dim m As Match = Regex.Match(input, "(?s)<a[^>]*>(.*?)</a>")
If m.Success Then
    Dim g As String = m.Groups(1).Value
    Console.WriteLine(g)  ' Outputs vbCrLf & "                name                "
End If

通常的假设是.将匹配任何内容,包括换行符,但通常不是这种情况。默认情况下,.仅匹配任何but换行符。如果希望.也包括换行符,则可以通过指定RegexOptions.Singleline选项(可能是易混淆的名称)来实现。因此,例如,它也可以工作:

Dim input As String = "<tr class=""hl"">
<td class=""vil fc"">
<a href=""mypage.php?New=4645"">
        name                </a>
</td>"
Dim m As Match = Regex.Match(input, "<a[^>]*>(.*?)</a>", RegexOptions.Singleline)
If m.Success Then
    Dim g As String = m.Groups(1).Value
    Console.WriteLine(g)  ' Outputs vbCrLf & "                name                "
End If

为了解决注释中提到的其他问题,如果只想匹配其中包含newdid参数的链接,则可以执行以下操作:

<a\s+[^>]*href\s*=[^>]*newdid\s*=[^>]*>(.*?)</a>
© www.soinside.com 2019 - 2024. All rights reserved.