我有一个字符串,例如下面的例子,我试图用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 ......”,
答案 0 :(得分:1)
你的.*
贪婪。这意味着它会尽可能多地消耗,因此您的第一场比赛将会使用整个字符串直至最后"
。然后在"
拆分一个匹配(实际上包含所有酒店名称)并取出第三个元素。 (查看hotelname.Value.Split("""").Count
,这将是巨大的)
诀窍是让重复变得非贪婪,甚至更好,不允许重复消耗"
:
"""HotelName"":""([^""]*)""
现在在"
和"
之间,我们只重复非引号字符,因此我们永远不会超过第一个结束语。仅此一项就可以解决您的问题,但我也添加了这些括号。它们不匹配任何实际的括号,而是创建一个捕获组,这使得更容易检索酒店名称:
For Each hotelname As Match In matches
ListBox1.Items.Add(hotelname.Groups[1])
对于每组括号,在它们内部匹配的东西将被放入match.Groups
的一个元素中,从左到右计算左括号。正则表达式匹配已经完成了获取各个值所需的所有内容,因此为什么要执行第二个拆分步骤。