Есть ли способ регулярного выражения многострочных блоков HTML? - PullRequest
0 голосов
/ 04 февраля 2019

Это часть моей html-страницы.Я хочу найти все имена между тегами: В его многострочном и "новом" ключах каждый раз разные цифры.

        <tr class="hl">
        <td class="vil fc">
            <a href="mypage.php?new=4645">
                name                </a>
        </td>

1 Ответ

0 голосов
/ 04 февраля 2019

Класс 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, "<a[^>]*>((?:.|\s)*?)</a>")
If m.Success Then
    Dim g As String = m.Groups(1).Value
    Console.WriteLine(g)  ' Outputs vbCrLf & "                name                "
End If

Распространенным предположением является то, что . будет соответствовать чему угодно, включая символы новой строки, но обычно это не так.По умолчанию . соответствует только символам , но символам новой строки.Если вы хотите, чтобы . также включал новые строки, вы можете сделать это, указав, возможно, путанно названный параметр 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...