让所有正则表达式匹配出现在Listbox,VB.NET中

时间:2012-11-07 23:34:42

标签: regex vb.net listbox listboxitems

我有一个字符串,例如下面的例子,我试图用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”:“Homewood Suites by H ...”,“HotelName”:“ Knights Inn Arlington“,”HotelNameShort“:”Knights Inn Arlington“,”HotelNameShortAvailabilityRecommendations“:”Knights Inn Arlingto ...“,”HotelName“:”Howard Johnson Express Inn - Arlington Ballpark / Six Flags“,”HotelNameShort“:” Howard Johnson Express In ...“,”HotelNameShortAvailabilityRecommendations“:”Howard Johnson Expre ...“,”HotelName“:”Super 8 Arlington / SW“,”HotelNameShort“:”Super 8 Arlington / SW“,”HotelNameShortAvailabilityRecommendations“: “Super 8 Arlington / SW ......”,

1 个答案:

答案 0 :(得分:1)

你的.*贪婪。这意味着它会尽可能多地消耗,因此您的第一场比赛将会使用整个字符串直至最后"。然后在"拆分一个匹配(实际上包含所有酒店名称)并取出第三个元素。 (查看hotelname.Value.Split("""").Count,这将是巨大的)

诀窍是让重复变得非贪婪,甚至更好,不允许重复消耗"

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

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

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

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