Быстрый вопрос о регулярных выражениях - PullRequest
1 голос
/ 13 ноября 2010

(Да, я использую регулярные выражения для разбора HTML, это единственное известное мне решение)

У меня проблемы с созданием регулярного выражения для приведенного ниже фрагмента кода, на странице примерно 10 совпадений.

<A href="viewmessage.aspx?message_id=1906782643&Guid=25851900&SID=k1fprtq2dbadgshntng1w3qb" style="text-decoration:underline">Inner Text</A>

это регулярное выражение, которое я пытался

ниже приведен код, который я обычно использую для получения коллекции совпадений

Private Function Extract(ByVal source As String) As String()
        Dim mc As MatchCollection
        Dim i As Integer
        mc = Regex.Matches(source, _
"<A href=" & Chr(34) & "viewmessage.aspx?message_id *.</A>")
        Dim results(mc.Count - 1) As String
        For i = 0 To results.Length - 1
            results(i) = mc(i).Value
        Next
        Return results
    End Function

Dim str1 As String()
        Dim str2 As String
        Dim results As New StringBuilder
        str1 = Extract(result)
        For Each str2 In str1
            results.Append(str2 & vbNewLine)
        Next

RTBlinks.Text = results.ToString

Кто-нибудь может указать, что я делаю не так? Я провел несколько часов, пробуя разные вещи.

Я стараюсь программировать в основном как хобби, поэтому извиняюсь, если я сделал какие-либо явные ошибки.

1 Ответ

2 голосов
/ 13 ноября 2010

У вас есть *. там, где вам нужно .*. Прямо сейчас квантификатор * применяется к пробелу перед ним, и точка соответствует ровно одному символу. Переключите два, удалите пробел (это важно, и в этой точке нет пробела в вашей тестовой строке) и попробуйте снова.

Помните, что .* соответствует жадно, т.е. е. как можно больше символов (кроме новых строк). Так что если у вас не более одного тега <A> в строке, он все равно должен работать. Вместо этого немного безопаснее было бы .*?, чтобы точка соответствовала как можно меньшему числу символов; еще безопаснее [^<]*, который будет соответствовать чему угодно, кроме открывающих угловых скобок, убедившись, что мы не пересекаем границы тегов.

Однако, все эти меры терпят неудачу в определенных, нередких ситуациях (например, комментарии, строки атрибутов, вложенные теги, недопустимая разметка), поэтому вы должны позволять регулярным выражениям проигрывать на языках разметки, только если вы можете точно контролировать свои входные данные и знать ваши ограничения.

Кроме того, я думаю, что в VB.NET вы можете экранировать кавычки внутри строки, удваивая ее, поэтому вы можете просто написать

"<A href=""viewmessage.aspx?message_id=.*?</A>"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...