我有一个字符串,如下例所示,我在其中尝试使用 VB.NET 获取字符串中的所有酒店名称。
这是我的代码:
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 匹配项放入我的列表框中吗?感谢您的宝贵时间!
缩短的字符串:
"HotelName":"Homewood Suites by Hilton Dallas-Arlington","HotelNameShort":"Homewood Suites by Hilton...","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...",
最佳答案
你的 .*
是贪婪的。这意味着它会消耗尽可能多的资源,因此您的第一个匹配项将包含 整个 字符串,直到最后一个 "
。然后您拆分一个匹配项(实际上包含所有酒店名称)在 "
并取出第三个元素。 (查看hotelname.Value.Split("""").Count
,会很大)
诀窍是让重复成为非贪婪的,或者更好的是,不允许重复消耗 "
:
"""HotelName"":""([^""]*)""
现在在 "
和 "
之间我们只重复非引号字符,所以我们永远不能超过第一个结束引号。仅此一项就可以解决您的问题,但我还添加了这些括号。它们不会匹配任何实际的括号,而是创建一个捕获组,这使得酒店名称的检索更加容易:
For Each hotelname As Match In matches
ListBox1.Items.Add(hotelname.Groups[1])
对于每一组括号,里面匹配的内容将被放入match.Groups
的一个元素中,从左到右计算左括号。正则表达式匹配已经完成了获取单个值所需的一切,那么为什么还要执行第二个拆分步骤。
关于regex - 让所有正则表达式匹配出现在列表框中,VB.NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13280155/