3

我有一个字符串,例如下面的示例,我正在尝试使用 VB.NET 来获取字符串中的所有 HotelNames。

这是我的代码:

    Dim thepage As String = postreqreader.ReadToEnd

    Dim r As New Regex("""HotelName"":"".*""")
    Dim matches As MatchCollection = r.Matches(thepage)
    For Each hotelname As Match In matches
        ListBox1.Items.Add(hotelname.Value.Split("""").GetValue(3))
    Next

但是,这只会将第一个 HotelName 添加到我的 ListBox。有什么想法可以让每个 HotelName 匹配到我的列表框中吗?谢谢你的时间!

缩短字符串:

"HotelName":"达拉斯阿灵顿希尔顿惠庭套房酒店","HotelNameShort":"希尔顿惠庭套房酒店...","HotelNameShortAvailabilityRecommendations":"H...","HotelName":"阿灵顿骑士酒店","HotelNameShort":"Knights Inn Arlington","HotelNameShortAvailabilityRecommendations":"Knights Inn Arlingto...","HotelName":"Howard Johnson Express Inn - Arlington Ballpark / Six Flags","HotelNameShort":"Howard Johnson Express在...","HotelNameShortAvailabilityRecommendations":"Howard Johnson Express...","HotelName":"阿灵顿/西南速 8","HotelNameShort":"阿灵顿/西南速 8","HotelNameShortAvailabilityRecommendations":"速 8 阿灵顿/西南...",

4

1 回答 1

1

.*很贪心。这意味着它会尽可能多地消耗,因此您的第一个匹配项将占用整个字符串,直到最后一个". 然后,您将单个匹配项(实际上包含所有酒店名称)拆分为"并取出第三个元素。(看看hotelname.Value.Split("""").Count,它会很大)

诀窍是使重复不贪婪,甚至更好的是,不允许重复消耗"

"""HotelName"":""([^""]*)""

现在在"and"我们只是重复非引号字符,所以我们永远不能超过第一个结束引号。仅此一项就可以解决您的问题,但我还添加了这些括号。它们不会匹配任何实际的括号,而是创建一个捕获组,这使得酒店名称的检索更加容易:

For Each hotelname As Match In matches
    ListBox1.Items.Add(hotelname.Groups[1])

对于每组括号,其中匹配的内容将放入 的一个元素中match.Groups,从左到右计算左括号。正则表达式匹配已经完成了获取各个值所需的一切,所以为什么要执行第二个拆分步骤。

于 2012-11-07T23:54:08.817 回答